XQueryとXDMPを使用してXMLの複数のノードを更新:ノードレプレース

StackOverflow https://stackoverflow.com/questions/4510465

  •  12-10-2019
  •  | 
  •  

質問

XMLデータベース(MarkLogic)でXMLドキュメントを更新したいと思います。入力としてXMLがあり、ターゲットXMLに存在する各ノードを交換したいと考えています。

ノードが存在しない場合、それは追加されると素晴らしいでしょうが、それはおそらく別のタスクです。

データベース内の私のXML:

<user>
  <username>username</username>
  <firstname>firstname</firstname>
  <lastname>lastname</lastname>
  <email>email@mail.de</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はタイプnode()ではありません

しかし、とにかくそれは間違ったアプローチでしょうか?

サンプルコードを持っている人はいますか?

役に立ちましたか?

解決

私はそれに答えなければなりません:

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)]?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top