[xquery-talk] XQuery and id()/idref();
Controlling the children of nodes in the result sequence
Michael Kay
mike at saxonica.com
Wed Apr 23 19:53:01 PDT 2008
>
> So if I am right, you want to not include an element if one
> of its ancestors is included too? If you want so, use the
> following instead of the for:
>
> let $e := $d/a:collection/a:entry/a:data
> // *[@a:span = $s/@xml:id]
> return
> $e[not(ancestor::* = $e)]
>
That's not quite right, because the "=" tests for equality rather than
identity.
You could do
let $e := $d/a:collection/a:entry/a:data
//*[@a:span = $s/@xml:id]
return
$e[not(ancestor::* intersect $e)]
or you could do a recursive function which stops searching any deeper when
it finds a match:
declare function local:s($e as element(), $id as xs:string) as element()* {
$e/(if (@a:span eq $id)
then .
else */local:s(., $id))
}
Michael Kay
http://www.saxonica.com/
More information about the talk
mailing list