Ответ 1
Это даст вам имя текущего элемента (имя тега)
<xsl:value-of select ="name(.)"/>
OP-Edit: Это также сделает трюк:
<xsl:value-of select ="local-name()"/>
В XSLT есть
<xsl:value-of select="expression"/>
чтобы получить значение элемента, но есть ли что-то, чтобы выбрать имя тега элемента?
В такой ситуации:
<person>
<!-- required stuff -->
<name>Robert</name>
<!-- optional stuff, free form for future extension.
Using XMLSchema 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"/>
не существует. Но как это можно сделать?
Это даст вам имя текущего элемента (имя тега)
<xsl:value-of select ="name(.)"/>
OP-Edit: Это также сделает трюк:
<xsl:value-of select ="local-name()"/>
Никто не указал на тонкую разницу в семантике функций name()
и local-name()
.
name(someNode)
возвращает полный
имя node, которое включает
префикс и двоеточие в случае, если node
это элемент или атрибут.local-name(someNode)
возвращается только
локальное имя node, и что
не включает префикс и двоеточие
в случае, если node является элементом или
атрибут.Следовательно, в ситуациях, когда имя может принадлежать двум различным пространствам имен, необходимо использовать функцию name()
для того, чтобы эти имена были все еще выделены.
И, BTW, можно указать обе функции без каких-либо аргументов:
name()
является аббревиатурой name(.)
local-name()
является аббревиатурой local-name(.)
Наконец, помните, что не только элементы и атрибуты имеют имена, эти две функции также могут использоваться для PI, и на них они идентичны).
<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:value-of select="name(.)" /> : <xsl:value-of select="."/>
Для желающих нет:
<xsl:tag-of select="."/>
Однако вы можете повторно создать тег/элемент, перейдя:
<xsl:element name="{local-name()}">
<xsl:value-of select="substring(.,1,3)"/>
</xsl:element>
Это полезно в шаблоне xslt, который, например, обрабатывает форматирование значений данных для множества разных элементов. Когда вы не знаете имя обрабатываемого элемента, и вы все равно можете вывести один и тот же элемент и изменить значение, если это необходимо.