[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] current context preceding-sibling then following-sibling


Subject: Re: [xsl] current context preceding-sibling then following-sibling
From: Karl Stubsjoen <kstubs@xxxxxxxxx>
Date: Tue, 8 Mar 2005 13:58:03 -0700

I've tested the above preceding-sibling following-sibling scenarios
and they work as described, thanks J.Petschmann.

I have included a simpler example as to what data I am after.  Here is
the XML source followed by the intent of the xpath query to build
followed by the xpath query that I have written so far:

<data>
  <code>
    <record id="40" says="ruff" animal="dog">
    	<field fieldname="chase" id="50">cat</field>
    </record>
    <record id="50" says="meow" animal="cat">
    	<field fieldname="chase" id="60">mouse</field>
    </record>
    <record id="60" says="squeak" animal="mouse">
    	<field fieldname="chase" id="00">cheese</field>
    </record>
  </code>
  <animals>
    <animal id="60" />
    <animal id="50" />
    <animal id="40" />
    <animal id="50" />
    <animal id="60" />
    <animal id="40" />
    <animal id="50" />
    <animal id="40" />
    <animal id="80" />
  </animals>
</data>
 
I am interested in returning all matches for animals who are in a
proper "chase" order.  So for example, the above animal who's ID is
50, is correctly in order if the proceding-animal is 40 (there should
be 2 matches).  Similarily, the animal who's ID is 60 is in correct
order one time with the proceding-animal who's ID is 50.  This "chase"
order is to be derived by the code/record lookup above.

Here is what I have sofar for xpath queries:

HARD CODED SOLUTION:
/data/animals/animal[preceding-sibling::animal[1][@id = ( '40' ) and
following-sibling::animal[1]/@id= ( '50' ) ]]

FIRST 40 WOULD BE SUBSTITUTED WITH:
/data/code/record[field[@id=( '50' )]]/@id

RESULT OF THIS SUBSTITUTION:
/data/animals/animal[preceding-sibling::animal[1][@id = (
/data/code/record[field[@id=( '50' )]]/@id ) and
following-sibling::animal[1]/@id= ( '50' ) ]]

The above hard coded xpath query works...

My dilemna:  I can not hard code the 50.  I need to return all chase /
chasee combinations.

Any ideas?


On Mon, 07 Mar 2005 20:47:38 +0100, J.Pietschmann <j3322ptm@xxxxxxxx> wrote:
> Karl Stubsjoen wrote:
> > the context of the following-sibling following a preceding-sibling
> > should result you in the context of the current sibling?
> 
> It depends. Note:
> 
> > The short of it is, I am comparing the preceding-sibling with the
> > current.  The preceding-sibling must contain the code "XYZ" when the
> > current contains the code "WXY".
> 
> If you talk about "content", be aware that looking up elements
> both in the preceding-sibling and the following-sibling axis
> are likely to produce node sets, and the stringification of a
> node set will result in the string value of the first element in
> document order. An example XML
>  <foo>
>    <bar>1</bar>
>    <bar>2</bar>
>    <bar id="3">3</bar>
>  </foo>
> The statement
>  <xsl:value-of select="
>    /foo/bar[@id='3']/preceding-sibling::bar
>    /following-sibling::bar"/>
> 
> Will get you a 2, not a 3 as you might expect.
> If in doubt, use a position predicate
>  <xsl:value-of select="
>    /foo/bar[@id='3']/preceding-sibling::bar[1]
>    /following-sibling::bar[1]"/>
> 
> J.Pietschmann


Current Thread
Keywords