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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top