Есть ли имя элемента XSLT?

в 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 ответов


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

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

OP-Edit: это также сделает трюк:

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

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

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

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

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

name() - это аббревиатура name(.)

local-name() - это аббревиатура local-name(.)

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


<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>

для тех, кто заинтересован, нет:

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

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

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

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


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