Re: [xsl] Grouping problem

Subject: Re: [xsl] Grouping problem
From: Mukul Gandhi <gandhi.mukul@xxxxxxxxx>
Date: Mon, 1 Aug 2005 14:38:31 +0530
Thanks Mike for the XSLT 2.0 way to solve the problem. But it was
surprising for me that the problem cannot be solved in XSLT 1.0 using
preceding-sibling axis.

Regards,
Mukul

On 8/1/05, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> When comparing two node-sets,
>
>   X = Y
>
> means "some $x in X equals some $y in Y"
>
> But when you do
>
>   name(X) = name(Y)
>
> you are comparing two strings, not two node-sets. If X is a node-set, then
> name(X) is the name of the first node in X, and name(Y) is the name of the
> first node in Y. (In XSLT 2.0, with version="2.0", you would get an error
> trying to apply name() to a node-set containing more than one node. The
> change has been made to catch this common mistake.)
>
> In 2.0 you can write
>
> select="*[not(name() = preceding-sibling::*/name())]"
>
> but of course it would be more efficient to use xsl:for-each-group.
>
> Michael Kay
> http://www.saxonica.com/
>
>
> > -----Original Message-----
> > From: Mukul Gandhi [mailto:gandhi.mukul@xxxxxxxxx]
> > Sent: 01 August 2005 07:57
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: [xsl] Grouping problem
> >
> > I have the following XML file -
> > <?xml version="1.0" encoding="UTF-8"?>
> > <root>
> >    <a>1</a>
> >    <b>2</b>
> >    <d>3</d>
> >    <d>4</d>
> >    <b>5</b>
> >    <b>6</b>
> >    <c>7</c>
> >    <c>8</c>
> >    <a>9</a>
> > </root>
> >
> > I am trying to do grouping operation with the following XSL -
> > <?xml version="1.0" encoding="UTF-8"?>
> > <xsl:stylesheet version="1.0"
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> >
> >       <xsl:output method="xml" version="1.0" encoding="UTF-8"
> > indent="yes"/>
> >
> >       <xsl:template match="/root">
> >          <groups>
> >            <xsl:for-each select="*[not(name() =
> > name(preceding-sibling::*))]">
> >             <group name="{name()}" />
> >            </xsl:for-each>
> >          </groups>
> >       </xsl:template>
> >
> > </xsl:stylesheet>
> >
> > I am expecting output -
> > <groups>
> >    <group name="a" />
> >    <group name="b" />
> >    <group name="c" />
> >    <group name="d" />
> > </groups>
> >
> > But I get output -
> > <?xml version="1.0" encoding="UTF-8"?>
> > <groups>
> > <group name="a"/>
> > <group name="b"/>
> > <group name="d"/>
> > <group name="d"/>
> > <group name="b"/>
> > <group name="b"/>
> > <group name="c"/>
> > <group name="c"/>
> > </groups>
> >
> > Where is the problem?
> >
> > This is tested with Xalan-J 2.6.0 and Saxon 8.4
> >
> > Regards,
> > Mukul

Current Thread