[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
RE: [xsl] Grouping problem
Subject: RE: [xsl] Grouping problem From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Mon, 1 Aug 2005 22:27:52 +0100 |
These seem to be solutions to a different problem. The original XML has no @name attributes. Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Andrew Franz [mailto:afranz0@xxxxxxxxxxxxxxxx] > Sent: 01 August 2005 22:11 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: Re: [xsl] Grouping problem > > Mukul Gandhi wrote: > > >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 > > > > > > Solution #1: > <xsl:template match="groups"> > <xsl:for-each select="group"> > <xsl:sort select="@name" /> > <xsl:if test="not(@name = preceding-sibling::group/@name)"> > <group name="{@name}" /> > </xsl:if> > </xsl:for-each> > </xsl:template> > > Solution #2: > <xsl:template match="groups"> > <xsl:for-each select="group"> > <xsl:sort select="@name" /> > <xsl:apply-templates select="." /> > </xsl:for-each> > </xsl:template> > > <xsl:template match="group[(@name = preceding-sibling::group/@name)]" > priority="+1" /> > <xsl:template match="group"> > <group name="{@name}" /> > </xsl:template> > > Solution #3: > <xsl:key name="k2" match="group" use="@name" /> > > <xsl:template match="groups"> > <xsl:for-each select="group"> > <xsl:sort select="@name" /> > <xsl:apply-templates select="." /> > </xsl:for-each> > </xsl:template> > > <xsl:template match="group" priority="-1" /> > <xsl:template match="group[generate-id() = generate-id(key('k2', > @name)[1])]"> > group[<xsl:value-of select="@id" />]=<xsl:value-of select="@name" > /><br/> > </xsl:template> > > > > >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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Grouping problem, Andrew Franz | Thread | Re: [xsl] Grouping problem, Andrew Franz |
Re: [xsl] Grouping problem, Andrew Franz | Date | [xsl] XSL-FO multiple page headers, Michael Rerick |
Month |