[xquery-talk] distance between elements and hierarchical order
Sergio Andreozzi
sergio.andreozzi at cnaf.infn.it
Fri Dec 9 03:16:56 PST 2005
Wolfgang Hoschek wrote:
> Both can probably be solved by walking the ancestor axis of the
> elements towards the root.
> For 2) find the nearest common ancestor, and add up the steps.
for problem 1. (compute the hierarchical level) I've this solution so
far. It uses the recursion to generate the list of ancestors, then count
them:
declare function local:ancestors-self($n as node()?) {
if (empty($n))
then ()
else (local:ancestors-self($n/..), $n)
};
declare function local:Hlevel($n as node()?) as xs:integer{
count( local:ancestors-self($n) )-1
}
ex:
<?xml version="1.0" encoding="UTF-8"?>
<S>
<A>
<B>
<F>4</F>
<C>
<D>3</D>
<E>5</E>
<G>
<H>3</H>
</G>
<G>
<H>2</H>
</G>
</C>
</B>
</A>
</S>
for $A in doc("test.xml")/S/A
return <Result>{ local:Hlevel(($A)[1]) }</Result>
<Result>2</Result>
for $A in doc("test.xml")/S/A
return <Result>{ local:Hlevel(($A/B)[1]) }</Result>
<Result>3</Result>
for $A in doc("test.xml")/S/A
return <Result>{ local:Hlevel(($A/B/C/G/H)[1]) }</Result>
<Result>6</Result>
still working on no.2.
Sergio
More information about the talk
mailing list