我在O'Reiily书中找到了以下XQuery用户定义函数 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>
原始命名空间似乎已被剥离,但新的命名空间尚未附加或 只是处理器不打印命名空间,因为未受影响的命名空间声明也消失了吗?
答案 0 :(得分:1)
遗憾的是,eXist Sandbox结果窗口不显示命名空间属性(@xmlns)。但是,如果您将查询保存为.xq文件并通过浏览器运行它,您将看到它实际上正在保留命名空间信息。顺便说一下,名为eXide的Sandbox的下一代版本确实更好地显示了命名空间信息。请参阅http://demo.exist-db.org/exist/eXide/index.html的eXide演示。
答案 1 :(得分:0)
我在OSB 11上使用Saxon 9.3实现时遇到了类似的问题。奇怪的是它适用于Oxygen,但它不适用于OSB。