I can't figure out how to access all the attributes in a tag from an XML document.
Let's say I have the following XML:
<names>
<name firstname="Rocky" lastname="Balboa" divider=", "/>
<name firstname="Ivan" lastname="Drago" divider=", "/>
</names>
I want the following output: Rocky Balboa, Ivan Drago,
What I currently have is:
<xsl:for-each select="names/name">
<xsl:value-of select="@firstname"/>
<xsl:value-of select="@lastname"/>
<xsl:value-of select="@divider"/>
</xsl:for-each>
What I'm wondering is if it's possible to do this in just one value-of select instead of having to do three of them. So to clarify, I want to be able to output all the attributes in the tag with one single value-of select. Is this possible?
Thanks.
Because I'm not sure if the use of xsl:value-of
is a hard requirement, perhaps something like the following could be what you are locking for.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="name" mode ="print" >
<xsl:value-of select="@firstname"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@lastname"/>
<xsl:value-of select="@divider"/>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="names/name" mode="print"/>
</xsl:template>
</xsl:stylesheet>
You can use <xsl:apply-templates select="names/name" mode="print"/>
at any position you have considered about using a one line value-of for all attributes.
The above template will generate the following output:
Rocky Balboa, Ivan Drago,
Update crate output without using the attribute names:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="name" mode ="print" >
<xsl:for-each select="@*" >
<xsl:if test="not(position() = last() or position() = 1)">
<xsl:text> </xsl:text>
</xsl:if>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="names/name" mode="print"/>
</xsl:template>
</xsl:stylesheet>