[xsl] Positional Grouping Problem

Subject: [xsl] Positional Grouping Problem
From: Mukul Gandhi <gandhi.mukul@xxxxxxxxx>
Date: Fri, 5 Aug 2005 16:55:23 +0530
I have this XML file -
<?xml version="1.0"?>
<X>
  <Y>
    <Z>HI</Z>
    <Z>HI</Z>
    <Z>HI</Z>
    <Z>YES</Z>
    <Z>HI</Z>
    <Z>HI</Z>
  </Y>
</X>

I desire output -
<?xml version="1.0" encoding="utf-8"?>
<X>
   <Y>
      <group>
         <Z>HI</Z>
         <Z>HI</Z>
         <Z>HI</Z>
      </group>
      <Z>YES</Z>
      <group>
         <Z>HI</Z>
         <Z>HI</Z>
      </group>
   </Y>
</X>

i.e. all consecutive Z's with string HI should be grouped in element <group>

I have written this stylesheet so far to solve this problem -
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">

<xsl:output method="xml" indent="yes" />

<xsl:template match="/X">
  <X>
   <Y>
     <xsl:apply-templates select="Y" />
   </Y>
  </X>
</xsl:template>

<xsl:template match="Y">
   <xsl:apply-templates select="Z" />
</xsl:template>

<xsl:template match="Z">
   <xsl:choose>
     <xsl:when test=". = 'YES'">
       <xsl:copy-of select="." />
     </xsl:when>
     <xsl:when test="((. = 'HI') and not(preceding-sibling::Z[1] = 'HI'))">
       <group>
         <xsl:copy-of select="." />
         <xsl:call-template name="generate-group-elements">
           <xsl:with-param name="list" select="following-sibling::Z" />
         </xsl:call-template>
       </group>
    </xsl:when>
  </xsl:choose>
</xsl:template>

<xsl:template name="generate-group-elements">
   <xsl:param name="list" />

   <xsl:if test="$list[1]">
     <xsl:copy-of select="$list[1]" />
     <xsl:call-template name="generate-group-elements">
       <xsl:with-param name="list" select="$list[position() > 1]" />
     </xsl:call-template>
   </xsl:if>
</xsl:template>

</xsl:stylesheet>

But I am getting output -
<?xml version="1.0" encoding="utf-8"?>
<X>
   <Y>
      <group>
         <Z>HI</Z>
         <Z>HI</Z>
         <Z>HI</Z>
         <Z>YES</Z>
         <Z>HI</Z>
         <Z>HI</Z>
      </group>
      <Z>YES</Z>
      <group>
         <Z>HI</Z>
         <Z>HI</Z>
      </group>
   </Y>
</X>

Can somebody please find the bug in my stylesheet?

I have tested with Xalan-J 2.6.0, Saxon 6.5.3 and MSXML4 ; and I am
getting same output with all these three XSLT processors. I am hinging
slightly to Xalan and Saxon.

Regards,
Mukul

Current Thread