Изменить пространство имен в XQuery
Я нашел следующую пользовательскую функцию XQuery в книге OQReiily XQuery, и она используется для изменения пространства имен файла XML при его печати:
declare namespace functx = "http://www.functx.com";
declare function functx:change-element-ns-deep
($element as element(), $newns as xs:string) as element()
{
let $newName := QName ($newns, name ($element))
return (element {$newName}
{$element/@*,
for $child in $element/node()
return if ($child instance of element())
then functx:change-element-ns-deep ($child, $newns)
else $child
}
)
};
Один пример для вызова этой функции:
<text xmlns:pre="pre">
{
functx:change-element-ns-deep(<pre:x><pre:y>123</pre:y></pre:x>, "http://new")
}
</text>
возвращает:
<test xmlns:pre="pre" >
< x xmlns="http//new">
<y>123</y>
</x>
</test>
Но то, что у меня есть, это:
<test>
<x>
<y>123</y>
</x>
</test>
Похоже, что исходное пространство имен удалено, но новое еще не присоединено, или это просто, что процессор не печатает пространство имен, потому что незатронутое объявление пространства имен также пропало?
2 ответа
К сожалению, в окне результатов eXist Sandbox не отображаются атрибуты пространства имен (@xmlns). Но если вы сохраните свой запрос как файл.xq и запустите его через браузер, вы увидите, что он на самом деле правильно сохраняет информацию о пространстве имен. Кстати, версия Sandbox следующего поколения, называемая eXide, отображает информацию о пространстве имен несколько лучше. Смотрите демонстрацию eXide по адресу http://demo.exist-db.org/exist/eXide/index.html.
У меня есть похожая проблема с использованием реализации Saxon 9.3 на OSB 11. Странно это работает на Oxygen, но не на OSB.