Home > database >  How to convert xml using xslt?
How to convert xml using xslt?

Time:11-12

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&#10;</xsl:text>
    </xsl:for-each>
</xsl:template> 

</xsl:stylesheet>
  • Related