我在尝试构建一个基于旧的元素的新元素,其中包括复制其子元素。为了防止每个孩子为范围内的每个命名空间重复命名空间定义,我也希望复制命名空间声明。在XQuery中复制命名空间
通过$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>
会更有意义。
好吧,XPath规范声明它已被正式弃用:“从XPath 2.0开始,名称空间轴被弃用,不需要主机语言支持。不支持名称空间轴的主机语言不需要表示名称空间绑定以节点的形式出现。“ (在标题2.1之上的几行)http://www.w3.org/TR/xpath-30/#id-basics。顺便说一句,我的意见很可惜。 – grtjn 2012-03-30 15:43:41
@grtjn:这是我更喜欢XSLT到XQuery的许多原因之一:) – 2012-03-31 04:41:00
当然,@grtjn引用的内容也适用于XSLT :)您正在寻找的是一种简单的方法来复制所有范围内的名称空间而不是名称空间声明)。我个人会将你的FLWOR表达式作为一个新的函数'local:in-scope-namespaces($ arg as node())' – 2012-04-02 15:09:04