[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