2010-12-22 57 views
3

我想更新我的xml數據庫(Marklogic)中的XML文檔。我有xml作爲輸入,並希望替換目標xml中存在的每個節點。使用xquery和xdmp更新xml中的多個節點:node-replace

如果一個節點不存在,它會很好,如果它被添加,但那可能是另一個任務。

我的數據庫中的XML:

<user> 
    <username>username</username> 
    <firstname>firstname</firstname> 
    <lastname>lastname</lastname> 
    <email>[email protected]</email> 
    <comment>comment</comment> 
</user> 

$ user_xml的價值:

<user> 
    <firstname>new firstname</firstname> 
    <lastname>new lastname</lastname> 
</user> 

到目前爲止我的功能:

declare function update-user (
    $username as xs:string, 
    $user_xml as node()) as empty-sequence() 
{ 
    let $uri := user-uri($username) 
    return 
     for $node in $user_xml/user 
     return 
      xdmp:node-replace(fn:doc($uri)/user/fn:node-name($node), $node) 
}; 

首先,我不能在迭代$user_xml/user 。如果我嘗試遍歷$user_xml我得到的異常

ARG1不是類型的節點()

但也許它錯誤的做法反正?

有沒有人可能有示例代碼如何做到這一點?

+0

如果您不打算使用標準XQuery更新,也不使用標準XQuery來獲取更新結果,但是您將使用某些MarkLogic的擴展函數,那麼這是一個`xqueryengines`問題 – 2010-12-22 15:27:35

回答

5

我來回答它自己:

declare function update-user (
$username as xs:string, 
$user_xml as node()) as empty-sequence() 
{ 
let $uri := user-uri($username) 
return 
    for $node in $user_xml/* 
    let $target := fn:doc($uri)/user/*[fn:name() = fn:name($node)] 
    return 
     if($target) then 
      xdmp:node-replace($target, $node) 
     else 
      xdmp:node-insert-child(fn:doc($uri)/user, $node) 
}; 

但也許有人有更好的解決方案,/user/*[fn:name() = fn:name($node)]