xsl-list
[Top] [All Lists]

RE: [xsl] Xpath for a range of elements

2007-02-07 16:38:11
In this expression

<xsl:apply-templates select="*[. &lt;&lt; procedure[1]]"/> 

you've forgotten that the context changes inside the predicate. Assign
procedure[1] to a variable first, and it should be OK.

Another way of doing this, which also works in 1.0, is:

<prereq>
  <xsl:apply-templates select="procedure/preceding-sibling::*"/>
</prereq>
<xsl:apply-templates select="./procedure"/>
<postreq>
  <xsl:apply-templates select="procedure/following-sibling::*"/>
</postreq>

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


-----Original Message-----
From: Anderson, Paul [mailto:Paul(_dot_)Anderson(_at_)compuware(_dot_)com] 
Sent: 07 February 2007 22:53
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Xpath for a range of elements

Greetings,

Consider the following skeleton for an XML source file:

<section>
   <title>...</title>
   <para>...</para>
   <code-block>...</code-block>
   <para>...</para>
   <procedure>...</procedure>
   <para>...</para>
   <screen>...</screen>
   <para>...</para>
</section>

I need a Xpath expression that will return all nodes after 
the <title> and before the <procedure> (i.e., from 
section/para[1] through section/para[2]). Then I operate on 
the <procedure>. Then I need another Xpath expression that 
returns all the nodes after the procedure up to the end of 
the <section> (i.e., from section/para[3] through 
section/para[4]. The source documents vary enough that I do 
not know in advance the number of elements or nature of the 
elements before or after the <procedure>. I do, however, know 
that there is always one (and only
one) <procedure>.

In my research, I came across the following thread on this 
list 
(http://www.biglist.com/lists/xsl-list/archives/200608/msg00043.html).
This thread appeared to hold the answer for me but I can't 
make it work.
I saw that the solution was specific to Xpath 2.0 so I made 
sure to upgrade to Saxon 8 and to update my scripts so that 
they would work (e.g., migrate <xsl:document> to 
<xsl:result-document>, etc.). 

Here is an approximation of the template that matches the 
section in the example above:

<xsl:template match="section">
      <my-proc id="{(_at_)id}">
              <xsl:element name="proc-title">
                      <xsl:value-of select="./title"/>
              </xsl:element>
              <xsl:element name="procbody">
                      <xsl:element name="prereq">
                              <xsl:apply-templates select="*[.
&lt;&lt; procedure[1]]"/>
                      </xsl:element>
                      <xsl:apply-templates select="./procedure"/>
                      <xsl:element name="postreq">
                              <xsl:apply-templates select="*[.
&gt;&gt; procedure[1]]"/>
                      </xsl:element>
              </xsl:element>
      </my-proc>
</xsl:template>

I must be making a simple mistake. Any assistance is appreciated.

Best regards,

Paul Anderson



The contents of this e-mail are intended for the named 
addressee only. It contains information that may be 
confidential. Unless you are the named addressee or an 
authorized designee, you may not copy or use it, or disclose 
it to anyone else. If you received it in error please notify 
us immediately and then destroy it. 

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>