Re: [xsl] Removing hierarchy

Subject: Re: [xsl] Removing hierarchy
From: Martin Honnen <Martin.Honnen@xxxxxx>
Date: Thu, 01 Oct 2009 13:50:12 +0200
rowan@xxxxxxxxxxxxxxxxxxxxx wrote:
I've got an input file like this:
<items>
  <item>
    <a>abc</a>
    <b>def</b>
    <item>
      <a>ghi</a>
      <b>jkl</b>
    </item>
    <item>
      <a>mno</a>
      <b>pqr</b>
      <item>
        <a>stu</a>
        <b>vwx</b>
      </item>
    </item>
  </item
</items

The items can be nested to any depth.

I want to convert this to:

<items>
  <item>
    <level>0</level>
    <a>abc</a>
    <b>def</b>
  </item
  <item>
    <level>1</level>
    <a>ghi</a>
    <b>jkl</b>
  </item>
  <item>
    <level>1</level>
    <a>mno</a>
    <b>pqr</b>
  </item
  <item>
    <level>2</level>
    <a>stu</a>
    <b>vwx</b>
  </item>
</items

In other words I want to remove the hierarchy of items and replace it with
a 'level' element.

What's the best way of doing this?

Here is an XSLT 1.0 way:


<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  version="1.0">

<xsl:output indent="yes"/>

  <xsl:template match="items">
    <xsl:copy>
      <xsl:apply-templates select="descendant::item"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="item">
    <xsl:copy>
      <level><xsl:value-of select="count(ancestor::item)"/></level>
      <xsl:copy-of select="*[not(self::item)]"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>


--


	Martin Honnen
	http://msmvps.com/blogs/martin_honnen/

Current Thread