Subject: RE: 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: 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: 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
|