Мне нужна функция XQuery, которая может переписывать документ, в частности, возвращать подмножество дочерних узлов на основе массива строк, определяющих имена узлов для извлечения. Если должно удовлетворять определению, как показано ниже, и ему необходимо работать с любым произвольным документом.Переписать документ MarkLogic xml динамически на основе строк в XQuery
local:apply-node-includes($document, $includedNodeNames as xs:string*)
Учитывая я имел некоторые XML Doc
let $doc :=
<foo a="b">
<bar>hello</bar>
<baz>1</baz>
<bang>
<text>world</text>
</bang>
</foo>')
Тогда функция должна преобразовать документ таким образом, что только дочерние узлы с именем, указанным в $ includedNodes возвращаются.
Пример local:apply-node-includes($doc, 'baz')
возвратит
<foo a="b">
<baz>1</baz>
</foo>
Пример local:apply-node-includes($doc, ('bar','bang')))
возвратит
<foo a="b">
<bar>hello</bar>
<bang>
<text>world</text>
</bang>
</foo>
Я экспериментировал итерацию по узлам, и/или с использованием той или иной форме рекурсивного typeswitch, но до сих пор не смогли получить это правильно. Было бы здорово, если бы он работал полностью рекурсивно, поэтому «bang.text» включал бы только внуки, а не братья и сестры, но, возможно, это слишком много!
Рассмотрите возможность выполнения вашей функцией последовательности xs: QNames, а не строк. У вас есть работы, потому что ваш XML использует пространство имен по умолчанию, но при наличии пространств имен у вас возникнет проблема. –