Subject: Re: Positional Grouping Problem
From: Mukul Gandhi <gandhi.mukul@xxxxxxxxx>
Date: Fri, 5 Aug 2005 17:26:02 +0530
|
Thanks George :)
Regards,
Mukul
On 8/5/05, George Cristian Bina <george@xxxxxxx> wrote:
> Hi Mukul,
>
> You need to change the generate-group-elements template to stop copying
> when it encounters something different of HI, you can do this like below
> for instance:
>
> <xsl:template name="generate-group-elements">
> <xsl:param name="list" />
>
> <xsl:if test="$list[1]='HI'">
> <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>
>
> Alternatively you can place inside the list parameter only the desired Z
> elements.
>
> Best Regards,
> George
> ---------------------------------------------------------------------
> George Cristian Bina
> <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger
> http://www.oxygenxml.com
>
>
> Mukul Gandhi wrote:
> > 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
|