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

Re: RE: Finding corresponding node in structurally ide

Subject: Re: RE: Finding corresponding node in structurally identical sibling tree?
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Fri, 26 Apr 2002 09:46:50 -0700 (PDT)
ide corresponding
> > I need to quickly find the matching node to the current node
> > which is in a parallel branch with identical structure to the
> > branch I'm operating in. It seems like this should be really
> > simple, but the only solution I can come up with is
> > a recursive template to assemble the name of the path from
> > the branch tag down, and then compare that against the result
> > from the same template for each node in the second tree. The
> > trees may be of arbitrary depth. Any other ideas?
> 
> Depends what you mean by "quickly", but you could try:
> 
> <xsl:variable name="branch1index"
> select="count(/example/branch1/preceding::node())"/>
> <xsl:variable name="thisindex" select="count(preceding::node())"/>
> 
> select="/example/branch2/descendant::node[$thisindex -
$branch1index]"


Using only the count of preceding nodes is not sufficient to uniquely
determine a node. The number of ancestor nodes is also necessary.

Therefore, one XPath expression that returns the required corresponding
node is:

$br2//node()
  [count(preceding::node()) - $br2PrecIndex = $thisRelPrecIndex 
 and 
  count(ancestor::node()) - $br2AncIndex = $thisRelAncIndex
  ]

where there are the following variable definitions:

<xsl:variable name="br1" select="/*/branch1"/>
<xsl:variable name="br2" select="/*/branch2"/>

<xsl:variable name="thisPrecIndex" select="count(preceding::node())"/>
<xsl:variable name="thisAncIndex" select="count(ancestor::node())"/>

<xsl:variable name="br1PrecIndex" 
              select="count($br1/preceding::node())"/>
<xsl:variable name="br1AncIndex"
select="$br1/count(ancestor::node())"/>

<xsl:variable name="br2PrecIndex" 
              select="count($br2/preceding::node())"/>
<xsl:variable name="br2AncIndex"
select="$br2/count(ancestor::node())"/>

<xsl:variable name="thisRelPrecIndex" 
              select="$thisPrecIndex - $br1PrecIndex"/>
<xsl:variable name="thisRelAncIndex" 
              select="$thisAncIndex - $br1AncIndex"/>


This might seem a little bit complicated, however the idea is quite
simple.

Every node can be identified in a two-dimensional coordinate system, in
which the first axis is the "preceding" axis, and the second axis is
the "ancestor" axis (as we know, these two axes are non-overlapping).

That is, the pair:
 (count(preceding::node), count(ancestor::node))

uniquely identifies any node.

The above is an absolute coordinate system (relative to the root node).

We can express the pair of coordinates of a node relative to some
ancestor (in our case "branch1").

Then the corresponding node in the subtree rooted by "branch2" must
have the same pair of coordinates, relative to "branch2".

This simple relationship is expressed in the first XPath expression in
this message.

Cheers,
Dimitre Novatchev.



__________________________________________________
Do You Yahoo!?
Yahoo! Games - play chess, backgammon, pool and more
http://games.yahoo.com/

 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-2013 All Rights Reserved.