Process the XML recursively so that you can perform a sort on the <cal>
element children and preserve its ancestor structure:
declare function local:sort(
$xml as element(cal)
) as element()
{
element cal {
for $e in $xml/*
order by $e/@abc
return local:dispatch($e)
}
};
declare function local:remove-atts(
$xml as element()
) as element()
{
element { node-name($xml) } {
$xml/@* except $xml/@abc,
$xml/node()
}
};
declare function local:dispatch(
$xml as element()
) as element()
{
typeswitch ($xml)
case element(cal) return local:sort($xml)
case element(tree) return local:remove-atts($xml)
case element(tree-order) return local:remove-atts($xml)
default return local:process($xml)
};
declare function local:process(
$xml as element()
) as element()
{
element { node-name($xml) } {
$xml/@*,
for $n in $xml/node()
return local:dispatch($n)
}
};
local:process($xml)