Subject: RE: Xpath and Ranges
From: "David White" <davidw@xxxxxxxxxxx>
Date: Fri, 4 Aug 2006 08:12:20 -0500
|
Thanks for the quick feedback!
<xsl:template match="for $T1 in (//title)[1], $T2 in (//title)[2] return ($T1,
//*[. &-g-t;&-g-t; $T1 and .
&-l-t;&-l-t; $T2])">
<xsl:element name="sect1">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
Comes up as an invalid pattern still. ( the &-g-t-; are added for clarity )
Could it be my software? XMLSpy 2006?
-----Original Message-----
From: Joe Fawcett [mailto:joefawcett@xxxxxxxxxxx]
Sent: Friday, August 04, 2006 8:04 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: Xpath and Ranges
You need to escape the << to &-l-t-; &-l-t-; (dashes added for clarity,
remove in code).
You might want to escape >> to &-g-t-; &-g-t-; as well.
--
Joe
----- Original Message -----
From: "David White" <davidw@xxxxxxxxxxx>
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Friday, August 04, 2006 1:56 PM
Subject: RE: Xpath and Ranges
Hello,
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">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
Any suggestions?
Thanks!
-----Original Message-----
From: Michael Kay [mailto:mike@xxxxxxxxxxxx]
Sent: Wednesday, August 02, 2006 12:20 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: 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
element.
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
http://www.saxonica.com/
|