element toc { (for $s in fs:distinct-docorder( let $fs:sequence := doc("book.xml") return let $fs:last := fn:count($fs:sequence) return for $fs:dot at $fs:position in $fs:sequence return child::book ) return let $fs:v4 := $s return local:toc($fs:v4)) } function local:toc($book-or-section){ for $section in fs:distinct-docorder( let $fs:sequence := $book-or-section return let $fs:last := fn:count($fs:sequence) return for $fs:dot at $fs:position in $fs:sequence return child::section ) return element section { (fs:distinct-docorder( let $fs:sequence := $section return let $fs:last := fn:count($fs:sequence) return for $fs:dot at $fs:position in $fs:sequence return attribute::id ), fs:distinct-docorder( let $fs:sequence := $section return let $fs:last := fn:count($fs:sequence) return for $fs:dot at $fs:position in $fs:sequence return child::title ), let $fs:v4 := $section return local:toc($fs:v4)) } }