2012-03-30 75 views
1

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

回答

1

如果您允許使用XQuery更新,你可以使用一個transform表達式(複製/修改/返回)複製節點,然後修改名稱。

1

在XQuery中3.0,以下應該工作,如果您的實現支持命名空間軸(我相信這是一個可選功能):

<new-element> 
{$element/namespace::*} 
... 
</new-element> 
+1

好吧,XPath規範聲明它已被正式棄用:「從XPath 2.0開始,名稱空間軸被棄用,不需要主機語言支持。不支持名稱空間軸的主機語言不需要表示名稱空間綁定以節點的形式出現。「 (在標題2.1之上的幾行)http://www.w3.org/TR/xpath-30/#id-basics。順便說一句,我的意見很可惜。 – grtjn 2012-03-30 15:43:41

+0

@grtjn:這是我更喜歡XSLT到XQuery的許多原因之一:) – 2012-03-31 04:41:00

+1

當然,@grtjn引用的內容也適用於XSLT :)您正在尋找的是一種簡單的方法來複制所有範圍內的名稱空間而不是名稱空間聲明)。我個人會將你的FLWOR表達式作爲一個新的函數'local:in-scope-namespaces($ arg as node())' – 2012-04-02 15:09:04

0

如果您使用編程構造函數,我相信他們會以您需要的方式照顧名稱空間聲明。產生

<dmc:root xmlns:dmc="http://davidcassel.net/dmc"> 
    <dmc:parent attr="value"> 
    <stuff:child xmlns:stuff="http://davidcassel.net/stuff"/> 
    </dmc:parent> 
</dmc:root> 

添加案件向typeswitch

xquery version "1.0"; 

declare function local:transform($node) 
{ 
    typeswitch($node) 
    case element() 
    return element { fn:node-name($node) } { 
     $node/@*, 
     for $n in $node/* 
     return local:transform($n) 
    } 
    default return $node 
}; 

let $node := 
    <dmc:root xmlns:dmc="http://davidcassel.net/dmc"> 
    <dmc:parent attr="value"> 
     <stuff:child xmlns:stuff="http://davidcassel.net/stuff">some text</stuff:child> 
    </dmc:parent> 
    </dmc:root> 
return local:transform($node) 

運行,使您需要的結構性變化。這是否完成了你要找的東西?

使用標準XQuery 1.0在MarkLogic 5上進行測試。

+0

添加到這個問題中 - 對每個孩子定義'xmlns:stuff'當我試圖避免將它附加到父版的新版本時會更明智。 – 2012-03-31 15:26:40