mehrere Knoten in XML mit XQuery und xdmp Aktualisierung: node-Ersetzen
Frage
Ich möchte ein XML-Dokument in meiner XML-Datenbank (Marklogic) aktualisieren. Ich habe xml als Eingabe und wollen jeden Knoten ersetzen, die in der XML-Ziel existiert.
Wenn ein Knoten existiert nicht, es wäre toll, wenn es hinzugefügt wird, aber das ist vielleicht eine andere Aufgabe.
Meine XML in der Datenbank:
<user>
<username>username</username>
<firstname>firstname</firstname>
<lastname>lastname</lastname>
<email>email@mail.de</email>
<comment>comment</comment>
</user>
Der Wert von $ user_xml:
<user>
<firstname>new firstname</firstname>
<lastname>new lastname</lastname>
</user>
Meine Funktion so weit:
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)
};
Zunächst einmal kann ich nicht $user_xml/user
iterieren. Wenn ich zu iterieren $user_xml
versuchen bekomme ich die Ausnahme
arg1 ist nicht vom Typ Knoten ()
Aber vielleicht ist es der falsche Ansatz überhaupt?
Hat jemand vielleicht Beispielcode hat, wie dies zu tun?
Lösung
Ich habe es selbst zu beantworten:
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)
};
aber vielleicht hat jemand eine bessere Lösung zu /user/*[fn:name() = fn:name($node)]
?