RE: [xsl] Grouping problem

Subject: RE: [xsl] Grouping problem
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 1 Aug 2005 09:56:45 +0100
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