xsl-list
[Top] [All Lists]

RE: Finding deepest node

2005-12-02 13:41:54
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[(_at_)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[(_at_)a = 'avalue']/@id
  [not(count(ancestor::*) lt $start//node[(_at_)a =
'avalue']/@id/count(ancestor::*))]

The solution I would probably use in real life is:

<xsl:for-each select=".//node[(_at_)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(_dot_)gorman(_at_)gmail(_dot_)com] 
Sent: 02 December 2005 20:07
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Finding deepest node

On 12/2/05, marcus <m-lists(_at_)bristav(_dot_)se> wrote:
I have a structure where I for example need to do the following:

.//node[(_at_)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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--





--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>