RE: [xsl] Xpath and Ranges

Subject: RE: [xsl] Xpath and Ranges
From: "David White" <davidw@xxxxxxxxxxx>
Date: Fri, 4 Aug 2006 07:56:15 -0500

The below statement works fine when I run a XQUERY against my XML.  It returns
the nodes that I need.

for $T1 in (//title)[1], $T2 in (//title)[2] return ($T1, //*[. >> $T1 and .
<< $T2], $T2)

However, when I plug it into a XSLT template it complains about the >>,<<
characters.  I have tried different versions of them but none validate.

<xsl:template match="for $T1 in (//title)[1], $T2 in (//title)[2] return ($T1,
//*[. >> $T1 and . << $T2], $T2)">

<xsl:element name="sect1">

Any suggestions?


-----Original Message-----
From: Michael Kay [mailto:mike@xxxxxxxxxxxx]
Sent: Wednesday, August 02, 2006 12:20 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: [xsl] Xpath and Ranges

> Is it possible to use Xpath to select a range of nodes.
> <chapter>
> <title>X</title>
> <para>
> <para>
> <title>Y</title>
> </chapter>
> I would like an Xpath statement that would select //title[1]
> THROUGH //title[2] and include all nodes between.  Is this possible?

I'm assuming that <para> represents <para>....</para>, i.e. a complete

If you know that the nodes are siblings, and you are positioned on their
parent, then you can do

(title[1] , *[. >> title[1] and . << title[2]] , title[2])

If they aren't siblings and you are positioned on the root, then you can do

for $T1 in (//title)[1], $T2 in (//title)[2]
return ($T1, //*[. >> $T1 and . << $T2], $T2)

That's XPath 2.0; in 1.0 it's more tricky.

Michael Kay

Current Thread