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.
The XPath expression @* | node() selects the union of attribute nodes ( @* ) and all other types of XML nodes ( node() ). It is a shorthand for attribute::* | child::node() .
Execute an XSLT transformation from an XML fileOpen an XML document in the XML editor. Associate an XSLT style sheet with the XML document. Add an xml-stylesheet processing instruction to the XML document. For example, add the following line to the document prolog: <?
This post shows you how to convert a simple XML file to CSV using XSLT. The following XSL Style Sheet (compatible with XSLT 1.0) can be used to transform the XML into CSV. It is quite generic and can easily be configured to handle different xml elements by changing the list of fields defined ar the beginning.
XPath is a major element in the XSLT standard. XPath can be used to navigate through elements and attributes in an XML document. XPath is a syntax for defining parts of an XML document. XPath uses path expressions to navigate in XML documents.
try the following:
<xsl:template match="/">
<xsl:for-each select="names/name/@*">
<xsl:value-of select="concat( ., ' ')"/>
</xsl:for-each>
</xsl:template>
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>
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