Home. 
.

transparent

transparent

transparent

Altova Mailing List Archives


RE: [xsl] Finding deepest node

From: "Michael Kay" <mike@------------>
To:
Date: 12/2/2005 8:42:00 PM
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


transparent
Print
Mail
Like It
Disclaimer
.

These Archives are provided for informational purposes only and have been generated directly from the Altova mailing list archive system and are comprised of the lists set forth on www.altova.com/list/index.html. Therefore, Altova does not warrant or guarantee the accuracy, reliability, completeness, usefulness, non-infringement of intellectual property rights, or quality of any content on the Altova Mailing List Archive(s), regardless of who originates that content. You expressly understand and agree that you bear all risks associated with using or relying on that content. Altova will not be liable or responsible in any way for any content posted including, but not limited to, any errors or omissions in content, or for any losses or damage of any kind incurred as a result of the use of or reliance on any content. This disclaimer and limitation on liability is in addition to the disclaimers and limitations contained in the Website Terms of Use and elsewhere on the site.

.
.

transparent

transparent