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?
XSLT/XPath Reference: XSLT elements, EXSLT functions, XPath functions, XPath axes. The local-name function returns a string representing the local name of the first node in a given node-set.
XSLT <xsl:value-of> Element The <xsl:value-of> element is used to extract the value of a selected node.
XPath. At bottom, XSLT is a language that lets you specify what sorts of things to do when a particular element is encountered. But to write a program for different parts of an XML data structure, you need to specify the part of the structure you are talking about at any given time. XPath is that specification language ...
This will give you the current element name (tag name)
<xsl:value-of select ="name(.)"/>
OP-Edit: This will also do the trick:
<xsl:value-of select ="local-name()"/>
Nobody did point the subtle difference in the semantics of the functions name()
and local-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 for name(.)
local-name()
is an abbreviation for local-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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With