2015-02-23 131 views
0

我在MarkLogic中使用名稱空間1創建一個XML文檔。現在我想從它複製一個節點並將其粘貼到位於命名空間2中的另一個文檔中。如何將不同名稱空間的節點複製到新文檔?

我已經寫了一個函數來獲取這條數據(節點)從文檔中移出。該函數返回文檔2中的一個節點,該節點位於命名空間1中。

我希望此節點也與根文檔位於相同的命名空間中。

我可以從其名稱空間剝離節點嗎?然後將其插入另一個文檔? 任何其他程序來獲得所需的結果?

這裏我的結果,發現的根命名空間是從類別元素的命名空間不同...

<wijk id="1027K01" xmlns="http://www.nvsp.nl/wijk"> 
    <meta-data> 
    <!--Generated by DIKW for NetwerkVSP STT!P --> 
    <version>0.4</version> 
    <dateCreated>2015-02-22+01:00</dateCreated> 
    </meta-data> 
    <category name="Geografie" xmlns="http://www.cendris.nl/postcode"> 
    <variable name="Postcode"> 
     <segment name="6 positie postcode">1027AA</segment> 
     <segment name="5 positie postcode">1027A</segment> 
     <segment name="4 positie postcode">1027</segment> 
    </variable> 
    <variable name="Gemeente"> 
     <segment name="Gemeentecode">363</segment> 
     <segment name="Gemeentenaam">Amsterdam</segment> 
    </variable> 
    <variable name="Plaats"> 
     <segment name="Plaatsnaam">AMSTERDAM</segment> 
    </variable> 
    <variable name="Provincie"> 
     <segment name="Provinciecode">27</segment> 
     <segment name="Provincienaam">Noord-Holland</segment> 
    </variable> 
    <variable name="Cebuco"> 
     <segment name="Cebuco naam">(21) Amsterdam-Purmerend</segment> 
     <segment name="Cebuco code">21</segment> 
    </variable> 
    <variable name="Bible Belt"> 
     <segment name="nauwelijks">100</segment> 
     <segment name="enigszins">0</segment> 
     <segment name="redelijk sterk">0</segment> 
     <segment name="sterk">0</segment> 
     <segment name="zeer sterk">0</segment> 
    </variable> 
    <variable name="Urbanisatiegraad"> 
     <segment name="Zeer sterk stedelijk">100</segment> 
     <segment name="Sterk stedelijk">0</segment> 
     <segment name="Matig stedelijk">0</segment> 
     <segment name="Weinig stedelijk">0</segment> 
     <segment name="Niet stedelijk">0</segment> 
    </variable> 
    </category> 
</wijk> 

回答

2

有一個簡單的方法:使用functx:change-element-ns-deep函數。 functx庫與MarkLogic一起發佈。導入它們,用「」作爲新的名稱空間調用該函數,然後離開。

+1

您可以使用此導入行:「/MarkLogic/functx/functx-1.0-nodoc-2007-01.xqy」處的'import module namespace functx =「http://www.functx.com」;'。應該仍然像ML8那樣工作。 – grtjn 2015-02-23 23:05:45

0

您可以通過遞歸從節點剝離命名空間重新構建節點,它是隻使用當地的孩子名。您可以使用類似的方法將節點從一個名稱空間移動到另一個名稱空間。

注意:從節點剝離名稱空間會將該節點放入「空」名稱空間。該節點將保留在「空」名稱空間中,即使它被放置爲不同名稱空間節點的子節點。

下面是XQuery的一些例子命名空間操作:

xquery version "1.0-ml"; 

declare namespace html = "http://www.w3.org/1999/xhtml"; 
declare namespace other = "other"; 

declare function local:remove-namespace($x as node()) as node()? 
{ 
    if ($x instance of element()) 
    then 
    element { fn:local-name($x) } { 
     $x/(@*,node()) ! local:remove-namespace(.) 
    } 
    else $x 
}; 

declare function local:set-namespace($x as node(), $prefix as xs:string) as node()? 
{ 
    if ($x instance of element()) 
    then 
    element { xs:QName($prefix || ":" || fn:local-name($x)) } { 
     $x/(@*,node()) ! local:set-namespace(., $prefix) 
    } 
    else $x 
}; 

let $x := <html:p>blah, blah <html:strong>__</html:strong> blah</html:p> 
return (
    $x, 
    local:remove-namespace($x), 
    local:set-namespace($x, "other") 
) 

評估以下順序是抽查結果:

<html:p xmlns:html="http://www.w3.org/1999/xhtml">blah, blah <html:strong>__</html:strong> blah</html:p>, 
<p>blah, blah <strong>__</strong> blah</p>, 
<other:p xmlns:other="other">blah, blah <other:strong>__</other:strong> blah</other:p> 
0

命名空間節點是不是真的在XQuery數據模型的一等公民。 XQuery工作組顯然不認爲我們應該被允許操縱它們。但有一些技巧可用。

這裏有一個例子,用8.0-1.1測試:

declare function local:do(
    $n as node(), $ns as xs:string) 
as node() 
{ 
    typeswitch($n) 
    case document-node() return document { local:do($n/node(), $ns) } 
    case element() return element { QName($ns, local-name($n)) } { 
    $ns, 
    $n/@*, 
    local:do($n/node(), $ns) } 
    default return $n 
}; 

<test xmlns="a"> 
    <fubar><baz/></fubar> 
</test> 
! local:do(., "b") 

一旦你的XML元素(一個或多個)具有所期望的命名空間,你可以操縱他們像往常一樣:xdmp:node-insert-child例如,或爲圖書館之一內存中更新:https://github.com/ryanjdew/XQuery-XML-Memory-Operations

另一個有用的命名空間技巧涉及XPath namespace軸。如果您有嘈雜的名稱空間聲明,這也會很有幫助。

<test xmlns="a"> 
    <b:fubar xmlns:b="b"><baz/></b:fubar> 
    <b:fubar xmlns:b="b"><buz/></b:fubar> 
</test> 
! element { node-name(.) } { 
    node()/namespace::*, 
    @*, 
    node() } 

這會使xmlns:b聲明達到根元素的級別。

最後,您有時可以使用xdmp:quotexdmp:unquote,它有一個默認命名空間選項。

相關問題