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

RE: Finding deepest node

Subject: RE: Finding deepest node
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 2 Dec 2005 20:41:54 -0000
xslt node depth
The subject says "deepest" rather than "farthest", so I suspect the meaning
is the node with maximum depth.

See http://www.dpawson.co.uk/xsl/sect2/N2193.html#d3377e91

for a range of answers. Note that the node in .//node[@a = 'avalue']/@id
that is furthest from the context node will also be furthest from the root.

The design that seems to me the most elegant is the one using FXSL and
higher-order functions. 

I don't think it can be done in a single XPath expression, even with 2.0;
but it can if you assign the initial context node to a variable, in which
case it's

$start//node[@a = 'avalue']/@id
  [not(count(ancestor::*) lt $start//node[@a =
'avalue']/@id/count(ancestor::*))]

The solution I would probably use in real life is:

<xsl:for-each select=".//node[@a = 'avalue']/@id">
  <xsl:sort select="count(ancestor::*)" order="descending"/>
  <xsl:if test="position()=1">
    <xsl:sequence select="."/>
  </xsl:if>
</xsl:for-each>

It actually depends a little on what you want to happen if there are two
nodes both at the maximum depth.

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



> -----Original Message-----
> From: Jon Gorman [mailto:jonathan.gorman@xxxxxxxxx] 
> Sent: 02 December 2005 20:07
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re:  Finding deepest node
> 
> On 12/2/05, marcus <m-lists@xxxxxxxxxx> wrote:
> > I have a structure where I for example need to do the following:
> >
> > .//node[@a = 'avalue']/@id
> >
> > If I get multiple hits I only want to select the node that 
> is farthest
> > away from the context node. How would I do this with a 
> single xpath? Is
> > it possible at all?
> >
> 
> Well......what do you mean by farthest away?  I'm sure it's 
> probably possible.
> 
> say we had a tree like so
> 
> 1
> 1.1
> 1.2
> 1.2..3
> 2
> 2.1
> 2.1.2
> 3
> 3.1
> 4
> 5
> 5.1
> 
> (Where 1.1 indicates there is a node one level below the first node of
> the top level)
> 
> If the context node is at 1, would the "farthest away" be 
> 1.2.3, 5, 5.1?
> 
> Ie is it depth or breadth or any?
> 
> There's a couple of techniques, but if it's just linear, ie furthest
> sibling away, if there are more preceeding siblings, take first() of
> the set of all siblings or if there are more following siblings take
> last() of the set of all siblings
> 
> Jon

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.