xsl-list
[Top] [All Lists]

Positional Grouping Problem

2005-08-05 04:25:23
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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--