Существует ли элемент имени XSLT? - PullRequest
95 голосов
/ 25 февраля 2009

В 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"/>

не существует. Но как это можно сделать?

Ответы [ 5 ]

149 голосов
/ 25 февраля 2009

Это даст вам текущее имя элемента (имя тега)

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

OP-Edit: Это также поможет:

<xsl:value-of select ="local-name()"/>
98 голосов
/ 25 февраля 2009

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

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

Следовательно, в ситуациях, когда имя может принадлежать двум различным пространствам имен, необходимо использовать функцию name(), чтобы эти имена все еще различались.

И, кстати, обе функции можно указывать без аргументов :

name() - сокращение от name(.)

local-name() является сокращением для local-name(.)

Наконец , помните, что не только элементы и атрибуты имеют имена, эти две функции также могут использоваться на PI, и на них они идентичны).

14 голосов
/ 25 февраля 2009
<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>
9 голосов
/ 19 марта 2013

Для интересующихся нет:

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

Однако вы можете воссоздать тег / элемент, выполнив:

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

Это полезно в шаблоне xslt, который, например, обрабатывает форматирование значений данных для множества различных элементов. Если вы не знаете имя элемента, над которым работаете, и вы все равно можете вывести тот же элемент, и при необходимости измените значение.

6 голосов
/ 25 февраля 2009
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...