declare function local:split($x as node()) as node() { let $name := $x/name/text() return let $tag := if ($x/@gender = "M") then "man" else "woman" return let $sons := for $p in $x/children/person[@gender="M"] return local:split($p) return let $daughters := for $p in $x/children/person[@gender="F"] return local:split($p) return element {$tag} { attribute name { $name }, element sons { $sons }, element daughters { $daughters } } } ; for $p in ./doc/person return {local:split($p)}