In XSLT there is the
<xsl:value-of select="expression"/>
to get the value of an element, but is there something to select the tag-name of the element?
In a situation like this:
<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>
To get output like this:
name : Robert profession : programmer hobby : photography
Of course the above XSLT won't compile because
<xsl:tag-of select="expression"/>
doesn't exist. But how could this be done?
For those interested, there is no:
However you can re-create the tag/element by going:
This is useful in an xslt template that for example handles formatting data values for lots of different elements. When you don't know the name of the element being worked on and you can still output the same element, and modify the value if need be.
This will give you the current element name (tag name)
OP-Edit: This will also do the trick:
Nobody did point the subtle difference in the semantics of the functions
name()
andlocal-name()
.name(someNode)
returns the full name of the node, and that includes the prefix and colon in case the node is an element or an attribute.local-name(someNode)
returns only the local name of the node, and that doesn't include the prefix and colon in case the node is an element or an attribute.Therefore, in situations where a name may belong to two different namespaces, one must use the
name()
function in order for these names to be still distinguished.And, BTW, it is possible to specify both functions without any argument:
name()
is an abbreviation forname(.)
local-name()
is an abbreviation forlocal-name(.)
Finally, do remember that not only elements and attributes have names, these two functions can also be used on PIs and on these they are identical).