[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] Positional grouping with exceptions


Subject: RE: [xsl] Positional grouping with exceptions
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 22 Dec 2006 09:27:03 -0000

> However, Micheal Kay's solution isn't working, Saxon reports 
> that you cannot start with self:: in a group-starting-with 
> attribute. (Axis in pattern must be child or attribute).

Yes, sorry, replace match="self::a[....]" with match="a[.....]".

Michael Kay
http://www.saxonica.com/

> 
> The solution of Andrew Welch seemed to work better, until I 
> discovered that when I have a node containing a childnode and 
> some text, only the childnode remains in the resulting document.
> I've tried to modify the stylesheet, but no such luck.
> 
> --
> Fredrik Geers
> 
> > -----Original Message-----
> > Date: Wed, 20 Dec 2006 15:11:12 -0000
> > To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
> > From: "Michael Kay" <mike@xxxxxxxxxxxx>
> > Subject: RE: [xsl] Positional grouping with exceptions
> > Message-ID: <01c701c72449$161cb0a0$6401a8c0@turtle>
> > 
> > Try
> > 
> > <xsl:template match="book">
> >   <book>
> >     <xsl:for-each-group select="*"
> >       group-starting-with="self::a[not(child::text())] |
> >
> self::a[not(preceding-sibling::*[1][self::a])] | 
> >                            *[not(self::a)]">
> >       <xsl:choose>
> >         <xsl:when test="self::a[not(child::text())]">
> >           <a1><xsl:copy-of select="remove(current-group(),1)"/></a1>
> >         </xsl:when>
> >         <xsl:when test="self::a">
> >           <a1><xsl:copy-of select="current-group()"/></a1>
> >         </xsl:when>
> >         <xsl:otherwise> 
> >           <xsl:copy-of select="current-group()"/>
> > 
> > Not tested.
> > 
> > Michael Kay
> > http://www.saxonica.com/
> 
> > -----Original Message-----
> > Date: Wed, 20 Dec 2006 15:28:15 +0000
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > From: "Andrew Welch" <andrew.j.welch@xxxxxxxxx>
> > Subject: Re: [xsl] Positional grouping with exceptions
> > Message-ID:
> <74a894af0612200728o791232f5t915f97e8b0faf43@xxxxxxxxxxxxxx>
> > 
> > I think you need a modified identity transform for this one.  The 
> > following stylesheet walks the tree along the 
> following-sibling axis, 
> > allowing you to group <a>'s with text as you come across them:
> > 
> > <xsl:stylesheet version="2.0"
> > 	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> > 
> > <xsl:template match="node()">
> > 	<xsl:copy>
> > 		<xsl:copy-of select="@*"/>
> > 		<xsl:apply-templates select="node()[1]"/>
> > 	</xsl:copy>
> > 	<xsl:apply-templates select="following-sibling::*[1]"/>
> > </xsl:template>
> > 
> > <xsl:template match="a[text()]">
> > 	<al>
> > 		<xsl:apply-templates select="." mode="fill"/>
> > 	</al>
> > 	<xsl:apply-templates
> select="following-sibling::*[not(self::a[text()])][1]"/>
> > </xsl:template>
> > 
> > <xsl:template match="a[text()]" mode="fill">
> > 	<xsl:copy-of select="."/>
> > 	<xsl:apply-templates
> > select="following-sibling::*[1][self::a[text()]]" mode="fill"/> 
> > </xsl:template>
> > 
> > </xsl:stylesheet>
> > 
> > The output generated is:
> > 
> > <book>
> > 	<header>title</header>
> > 	<al>
> > 		<a>text</a>
> > 		<a>text</a>
> > 	</al>
> > 	<otherelement>title</otherelement>
> > 	<al>
> > 		<a>text</a>
> > 		<a>text</a>
> > 	</al>
> > 	<a/>
> > 	<al>
> > 		<a>text</a>
> > 	</al>
> > </book>
> > 
> > Notice the <a/> which wasnt present in your example - easy 
> to suppress 
> > if that really is the case.
> > 
> > By the way, Saxon 8.8 is available now.
> > 
> > cheers
> > andrew


Current Thread