RE: [xsl] Xpath and Ranges

Subject: RE: [xsl] Xpath and Ranges
From: "David White" <davidw@xxxxxxxxxxx>
Date: Fri, 4 Aug 2006 09:21:43 -0500
Sure,

I have XML thatbs been converted from RTF > WordML > docbook XML

The docbook XML lacks any sections.  I have XML that looks like this


<chapter>
<title/>
<para/>
<title/>
<para/>
<para/>
<title/>
<para/>
</chapter>

Thatbs invalid docbook XML.  What I want is something like this:


<chapter>
<title/>
<para/>
<sect1>
<title/>
<para/>
<para/>
<sect2>
<title/>
<para/>
</sect2>
</sect1>
</chapter>




-----Original Message-----
From: Michael Kay [mailto:mike@xxxxxxxxxxxx]
Sent: Friday, August 04, 2006 9:07 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: [xsl] Xpath and Ranges

>
> Here is the template where I am trying to grab a set of nodes
> in order to wrap them in a parent node (since this is docbook
> Im trying to wrap things in sect1)
>
> <xsl:template match="for $T1 in (//title)[1], $T2 in

The match attribute of xsl:template must be a pattern, it can't be a
generalized XPath expression.

Use xsl:apply-templates to select the nodes that you want to process, use
xsl:template to define what processing to apply to the selected nodes.

I suspect that what you want might be something like:

<xsl:template match="/">
  <sect1>
    <xsl:copy-of select="for $T1 in (//title)[1], $T2 in (//title)[2]
              return ($T1, //*[. &gt;&gt; $T1 and . &lt;&lt; $T2])"/>
  </sect1>
</xsl:template>

but not quite: because if there's an X element that passes the test, then
the children of X will probably pass it too, and if you copy X then you
don't want to copy its children, or they'll end up in the output twice.

So: you asked for an XPath expression that selected all the nodes between
the two titles, but I don't think that's what you really wanted. It might be
best to explain the real problem that you're trying to solve.

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


> (//title)[2] return ($T1, //*[. &gt;&gt; $T1 and . &lt;&lt; $T2])">
> 	<xsl:element name="sect1">
> 	<xsl:apply-templates/>
> 	</xsl:element>
> </xsl:template>
>
> I've installed Saxon 8.7.3N, and use XMLSpy with this commandline:
> c:\saxon\Transform.exe -o %2 %1 %3
>
> The error I get is:
>
> XSLT Pattern syntax error at char 0 on line 83 (the template
> above), In {for $}: Unexpected token in patter, found "for"
> Failed to compile stylesheet, 1 error detected.
>
> Hope that helps..let me know if I can supply any more information.
>
> FYI the material Im apply this too is going to be open to the
> public (its actually apart of the OGL, open gaming license).
> So, Im trying to learn how to apply XPATH.
>
> Thanks!
>
> David White
>
> -----Original Message-----
> From: Michael Kay [mailto:mike@xxxxxxxxxxxx]
> Sent: Friday, August 04, 2006 8:35 AM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] Xpath and Ranges
>
> >
> > Could it be my software? XMLSpy 2006?
> >
>
> Does your xsl:stylesheet element specify version="2.0"? IIRC,
> XMLSpy invokes a 2.0 processor when you specify
> version="2.0", and a 1.0 processor otherwise.
>
> Michael Kay
> http://www.saxonica.com/

Current Thread