declare option saxon:output "method=text"; declare option saxon:output "omit-xml-declaration=yes"; (: remove all whitespace nodes from elements of the input tree :) declare function local:strip-space($element){ element {local-name($element)} { $element/@*, for $child in $element/node() return if ($child instance of text() and normalize-space($child)='') then () else if ($child instance of element()) then local:strip-space($child) else $child } }; declare function local:nl-and-indent($nb){ concat(' ',string-join(for $i in 1 to $nb return ' ','')) }; declare function local:attribute($attribute){ concat('@',local-name($attribute),'[',data($attribute),']') }; declare function local:text($text){ normalize-space($text) }; declare function local:element($elem,$indent){ let $newName := local-name($elem), $newIndent := $indent+string-length($newName)+1 return concat( $newName,"[", string-join( for $child at $pos in $elem/(@*|*|text()) return ( if($pos>1) then local:nl-and-indent($newIndent) else (), typeswitch ($child) case attribute() return local:attribute($child) case text() return local:text($child) case element() return local:element($child,$newIndent) default return () ),""), "]" ) }; local:element(local:strip-space(/*),0)