RE: [xsl] Finding deepest node

Subject: RE: [xsl] Finding deepest node
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 2 Dec 2005 20:41:54 -0000
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: [xsl] 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
  • [xsl] Finding deepest node
    • marcus - Fri, 02 Dec 2005 20:24:08 +0100
      • Jon Gorman - Fri, 2 Dec 2005 14:07:26 -0600
        • marcus - Fri, 02 Dec 2005 21:37:21 +0100
        • Michael Kay - Fri, 2 Dec 2005 20:41:54 -0000 <=
        • Message not available
      • <Possible follow-ups>
      • marcus - Fri, 02 Dec 2005 22:01:07 +0100