Input XML file:
<a>
<Item key="1">
<c1>
<d11>
</d11>
<d12 value="1" />
<d13 />
</c1>
</Item>
<b2>
<Item key="fix">
<d21>
</d21>
<d22 value="yes" />
<d23 />
</Item>
</b2>
<b3>
<c3>
<d31>
</d31>
<Item key="price">
<e2 value="no" />
<e3 />
</Item>
</c3>
</b3>
</a>
How can I write a .xsl stylesheet so that the outputs are like this:
a/Item [@key='1']/c1/d12/@value
a/b2/Item [@key='fix']/d22/@value
a/b3/с2/Item[@key='price']/e2/@value
That is, the full path to a tag with an @value attribute can contain an Item tag with a special value for the key attribute.
CodePudding user response:
How about something simple:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:for-each select="//@value">
<xsl:for-each select="ancestor::*">
<xsl:value-of select="name()"/>
<xsl:if test="@key">
<xsl:text>[@key="</xsl:text>
<xsl:value-of select="@key"/>
<xsl:text>"]</xsl:text>
</xsl:if>
<xsl:text>/</xsl:text>
</xsl:for-each>
<xsl:text>@value </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>