Я пытаюсь создать новый элемент на основе старого, включая копирование его дочерних элементов. Чтобы каждый дочерний элемент не повторял определения пространства имен для каждого пространства имен в области, я также заинтересован в копировании объявлений пространства имен.
Объявления пространства имен не воспринимаются как обычные атрибуты через $element/@*
.
Если я ограничу свой код для работы только с XQuery 3.0, я могу сделать следующее:
<new-element>
{
for $ns-prefix in in-scope-prefixes($element)
let $ns-uri := namespace-uri-for-prefix($ns-prefix, $element)
return namespace { $ns-prefix } { $ns-uri }
}
...
</new-element>
Есть ли лучший способ?
Чтобы прояснить проблему - мой оригинальный документ выглядит так:
<root xmlns:stuff="...">
<child name="foo"/>
<child name="bar"/>
</root>
Когда я копирую детей в новый документ, я получаю следующее:
<new-element>
<child xmlns:stuff="..." name="foo"/>
<child xmlns:stuff="..." name="bar"/>
</new-element>
... тогда как было бы разумнее просто присоединить объявление xmlns:stuff
к <new-element>
.