我在嘗試構建一個基於舊的元素的新元素,其中包括複製其子元素。爲了防止每個孩子爲範圍內的每個命名空間重複命名空間定義,我也希望複製命名空間聲明。在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