[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

XPath: ancestor:: axis vs. use of ../../../ etc.

Subject: XPath: ancestor:: axis vs. use of ../../../ etc.
From: "William Reilly" <wreilly@xxxxxxxxxxx>
Date: Fri, 7 Mar 2003 15:49:29 -0500
xpath ancestor axis
Greetings.

Looking for a little better understanding of the results I'm getting.

--------------------
My initial use of abbreviated XPath axes like simple "../../@name"
worked. (See # 1 down below)

But then exploring *going up one more level* (../) so I could 
then *explicitly name* the element did _not_ work:  
        "../../../span-fill/@name"  (See # 2 down below)

[ I guess I thought the XPath would be more readable if 
   I showed *by name* which element had the @name attribute
  vs. leaving it just at a long string of "../../../" ]


parent::
Further looking into the parent::node() attribute showed me that it 
behaved the same as the use of both ../../ and ../../../
(that's what it's supposed to do, I'm sure!).  (See #s 3 and 4 below)


axis::
Finally, the use of "ancestor::span-fill/@name" did just what I wanted: 
it got the right data, and shows 
the name of the element explicitly.   (See # 5 below)

-------------------------------------------
>> My basic question: what is going on that 
	A.	"../../@name" 
is so different from 
	B.	"../../../span-fill/@name"
?
>> Or put another way, 
  what is it that the ancestor:: axis does
 to help the correct nodeset selection, such that it works,
  vs. whatever nodeset being built up by "B." that 
  evidently does not (correctly?) test the span-fill/@name value?

	C.	"ancestor::span-fill/@name"


A. YES. Gets correct info (a single <span-value> element contents: 
   "(California Prima OLB)"
B. NO. Gets the contents of ALL the <span-value> elements: 
  "(California Prima OLB California Prima NO OLB California SAVING OLB
etc. etc. )"
C. YES. Works correctly, like A.

========================
XML
========================
<span-fills>
   <span-fill name="checking-product">
      <segment-permutation name="1ca_2olb">
         <span-value>California Prima OLB</span-value>
      </segment-permutation>
      <segment-permutation name="1ca_2nonolb">
         <span-value>California Prima NO OLB</span-value>
      </segment-permutation>
      ...
   <span-fill name="saving-product">
      <segment-permutation name="1ca_2olb">
         <span-value>California SAVING OLB</span-value>
      </segment-permutation>      
       ...
   </span-fill>
   ...
<span-fills>

========================
XSLT
========================
<xsl:for-each 
select="document($basedir_span-fillLookupFilenameExt)//span-fills/span-f
ill"> 

<xsl:apply-templates 
select="segment-permutation/span-value[ancestor::span-fill/@name=$span-i
d]
 
[ancestor::segment-permutation/@name=$segment]/node()"/>


Thanks very much,
William Reilly
wreilly@xxxxxxxxxxx
Boston, Massachusetts, U.S.A.

===================================
1. "../../"
YES (1st approach)
<xsl:apply-templates
select="segment-permutation/span-value[../../@name=$span-id][../@name=$s
egment]"/> 


2. "../../../span-fill/"
NO  (2nd approach)
<xsl:apply-templates
select="segment-permutation/span-value[../../../span-fill/@name=$span-id
][../../segment-permutation/@name=$segment]"/>


3. "parent::node()/parent::node()/"
YES  (emulating 1st approach, but with 'parent::' axis)
<xsl:apply-templates
select="segment-permutation/span-value[parent::node()/parent::node()/@na
me=$span-id][parent::node()/segment-permutation/@name=$segment]"/>


4. "parent::node()/parent::node()/parent::node()/span-fill/"
NO   (emulating 2nd approach, but with 'parent::' axis)
<xsl:apply-templates
select="segment-permutation/span-value[parent::node()/parent::node()/par
ent::node()/span-fill/@name=$span-id][parent::node()/parent::node()/segm
ent-permutation/@name=$segment]"/>


5. "ancestor::span-fill/" 
YES  (arguably emulating 2nd approach, but with 'ancestor::' axis)
<xsl:apply-templates
select="segment-permutation/span-value[ancestor::span-fill/@name=$span-i
d][ancestor::segment-permutation/@name=$segment]"/>

+++ /END
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2011 All Rights Reserved.