Re: [xsl] Grouping question

Subject: Re: [xsl] Grouping question
From: Martin Honnen <Martin.Honnen@xxxxxx>
Date: Wed, 13 May 2009 15:55:24 +0200
M Balaji wrote:

How do I need to write the for-each-group element for the above condition?

Here is an attempt with a function:


<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xmlns:xsd="http://www.w3.org/2001/XMLSchema";
  exclude-result-prefixes="xsd mf"
  xmlns:mf="http://example.com/2009/mf";
  version="2.0">

<xsl:output indent="yes"/>

<xsl:function name="mf:group-heading" as="element()*">
<xsl:param name="els" as="element()*"/>
<xsl:param name="level" as="xsd:integer"/>
<xsl:for-each-group select="$els" group-starting-with="*[local-name() eq concat('h', $level)]">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
<xsl:sequence select="mf:group-heading(current-group() except ., $level + 1)"/>
</xsl:element>
</xsl:for-each-group>
</xsl:function>


  <xsl:template match="root">
    <xsl:copy>
      <xsl:sequence select="mf:group-heading(*, 2)"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

When applied to

<root>
<h2>testing</h2>
<p>data recovery, and application testing. </p>
<h4>Support for file system</h4>
<p>Objects for replication:</p>
<h3>Session</h3>
<p>Before creating sessions... </p>
<h3>Wizard</h3>
<p>In Manager, you can . </p>
<h4>Support for file system</h4>
<p>Objects for replication:</p>
<h2>testing1</h2>
</root>

Saxon 9 gives me

<root>
<h2>testing<p>data recovery, and application testing. <h4>Support for file system<p>Objects for replication:</p>
</h4>
</p>
<h3>Session<p>Before creating sessions... </p>
</h3>
<h3>Wizard<p>In Manager, you can . </p>
<h4>Support for file system<p>Objects for replication:</p>
</h4>
</h3>
</h2>
<h2>testing1</h2>
</root>


which I think has the structure you want, you might need to tune the whitespace/indentation.


--


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

Current Thread