Subject: RE: Another Grouping question
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 17 Feb 2005 12:32:45 -0000
|
$next-marker is a node, not a number, so comparing it with position() isn't
going to be useful.
You can use this approach in XSLT 2.0, where you would write
following-sibling::*[. << $next-marker]
but of course XPath 1.0 doesn't have the "<<" operator.
The usual way of tackling this in 1.0 is
<xsl:variable name="this" select="generate-id()"/>
<xsl:for-each
select="following-sibling::*[generate-id(preceding-sibling::marker[1])=$this
]">
that is, select all the following siblings whose first preceding marker is
the node you started at.
A recursive scan of the siblings is likely to be more efficient if there are
many of them.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Paul Clarke [mailto:pclarke@xxxxxxxxxxxxxxxx]
> Sent: 17 February 2005 12:07
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Another Grouping question
>
> Hello,
>
> Thank you to those who responded to my previous question.
>
> I now realise that the key to a lot of my current problems
> are to create the
> correct groupings.
>
> Before coming back to the list I spent a lot of time reading
> Michael Kay's
> Programmer Reference but I'm still struggling with
> constructing the correct
> predictate.
>
> I have the following XML:
>
> <frag>
> <p/>
> <p/>
> <table/>
> <list/>
> <marker/>
> <p/>
> <p/>
> <p/>
> <p/>
> <table/>
> <p/>
> <p/>
> <table/>
> <list/>
> <marker/>
> <p/>
> <p/>
> <table/>
> <list/>
> </frag>
>
> I need to create a grouping that selects a marker element
> followed by all
> its siblings up but not including to the next marker.
>
> An attempted solution is shown below, but it didn't work. (No
> chuckling
> please).
>
> I've tried to do this by creating a template that matches a
> marker and then
> calculating the position of the following-sibling::marker and
> placing this
> in a variable. I then try to group all the required elements
> by testing for
> the position of the context being less than the next marker.
>
> <xsl:template match="marker">
> <xsl:variable name="next-marker"
> select="following-sibling::marker[1]"/>
> <xsl:variable name="chunk" select=". |
> following-sibling::*[position()< $next-marker]"/>
> <div>
> <mblock><xsl:apply-templates select="$chunk"/></mblock>
> </div>
> </xsl:template>
>
> Thanks
>
> Paul Clarke
|