XQueryとXDMPを使用してXMLの複数のノードを更新:ノードレプレース
質問
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)]
?
所属していません StackOverflow