declare function local:one_level($p as element()) as element() { { for $s in doc("partlist.xml")//part where $s/@partof = $p/@partid return local:one_level($s) } }; { for $p in doc("partlist.xml")//part[empty(@partof)] return local:one_level($p) }