Чи є елемент імені XSLT?


101

У XSLT є

<xsl:value-of select="expression"/>

щоб отримати значення елемента, але чи є щось для вибору тегу-імені елемента?

У такій ситуації:

<person>
  <!-- required stuff -->
  <name>Robert</name>
  <!-- optional stuff, free form for future extension. 
       Using XMLSchema's xsd:any -->
  <profession>programmer</profession>
  <hobby>photography</hobby>
</person>

<xsl:for-each select="person">
   <xsl:tag-of select="."/> : <xsl:value-of select="."/>
</xsl:for-each>

Щоб отримати такий результат:

name : Robert
profession : programmer
hobby : photography

Звичайно, вищезгаданий XSLT не збирається, оскільки

 <xsl:tag-of select="expression"/>

не існує. Але як це можна було зробити?


Найбільш релевантний тег для цього питання - XPath. Обидві функції є стандартними функціями XPath і їх можна використовувати в виразі XPath у контексті будь-якої мови хостингу (C #, XSLT, XQuery, ...) Будь ласка, повторно позначте
Dimitre Novatchev

Цей текст: "У XSLT є <xsd: value-of select =" izraz "/>" - містить помилку. Зазвичай для вказівки XSLT використовується префікс "xsl". Зазвичай при використанні XML-схеми ми використовуємо префікс "xsd" або "xs". Будь ласка, виправте.
Димитрій Новатчев,

Відповіді:


157

Це дасть вам назву поточного елемента (ім'я тегу)

<xsl:value-of select ="name(.)"/>

OP-редагування: це також зробить трюк:

<xsl:value-of select ="local-name()"/>

12
local-name - це те, що ви хочете 9 разів з 10
annakata

20
local-name - це простір імен, тому зазвичай це краще.
Джон Ш

102

Ніхто не вказував на тонку різницю в семантиці функцій name()і local-name().

  • name(someNode) повертає повне ім'я вузла, що включає префікс і двокрапку у випадку, якщо вузол є елементом або атрибутом.
  • local-name(someNode) повертає лише локальну назву вузла, і це не включає префікс і двокрапку, якщо вузол є елементом або атрибутом.

Тому в ситуаціях, коли ім’я може належати до двох різних просторів імен, потрібно використовувати name()функцію для того, щоб ці імена все-таки відрізнялися.

І, BTW, можна вказати обидві функції без будь-якого аргументу :

name() - це абревіатура для name(.)

local-name() - це абревіатура для local-name(.)

Нарешті , пам’ятайте, що не тільки елементи та атрибути мають назви, ці дві функції також можуть бути використані на PI, і в них вони однакові).


15
<xsl:for-each select="person">
  <xsl:for-each select="*">
    <xsl:value-of select="local-name()"/> : <xsl:value-of select="."/>
  </xsl:for-each>  
</xsl:for-each>

Як хороша практика завжди використовуйте normalize-space () при отриманні value-вузла <xsl: value-of select = "normalize-space (.)" /> Це дозволить обрізати зайві пробіли
SO User

Така нормалізація / санітарія знадобиться лише в тому випадку, якщо б це не було зроблено на етапі збору вхідних даних. Потім це дозволяє економити необхідність робити це в час доступу, що зазвичай набагато частіше. Можна зробити це перед тим, як додати до RDB, а XML-документ - це лише інша база даних.
Патанджалі

9

Для тих, хто цікавиться, немає:

<xsl:tag-of select="."/>

Однак ви можете знову створити тег / елемент, перейшовши:

<xsl:element name="{local-name()}">
  <xsl:value-of select="substring(.,1,3)"/>
</xsl:element>

Це корисно в шаблоні xslt, який, наприклад, обробляє значення форматування даних для безлічі різних елементів. Якщо ви не знаєте ім'я елемента, над яким працюєте, і ви все одно можете вивести той самий елемент і змінити значення, якщо це необхідно.


6
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>

То чому ж за цей голос проголосували? Згаданий міг би згадати local-name (), якщо ви також не хочете простору імен, але широкій спільноті було б корисно пояснити, чому це не працює.
Роуленд Шоу

Можливо, він не міг перетворити заданий XML. ім'я (.) у цьому випадку буде "особою". це має бути "ім'я", "професія" та "хобі".
Рей Лу

@CodeMelt Чому тоді ви не відмовились від прийнятої відповіді? Це добре, але навіть менш специфічно, ніж цей. Я відповідав на відповідь Роуленда Шоу, оскільки він дає відповідь на питання. Задовольняйте, оскаржуйте лише тоді, коли підпис містить неправильну, некоректну або оманливу інформацію
Димитрій Новатчев,

4
Виправлена ​​ця незначна деталь - особисто я думаю, що люди повинні пояснити, чому щось зволікають, оскільки це допомагає пояснити колективні знання ...
Rowland Shaw,

Наша репутація може привернути увагу, але оскільки вони не є гарантією того, що те, що ми опублікували, є вартим, саме якість нашого внеску справді розраховує. Жодне обґрунтування не робить неякісних внесків.
Патанджалі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.