Domanda

Se si desidera aggiornare un documento XML nel mio database XML (Mark Logic). Ho XML come input e voglio sostituire ogni nodo esistente nel XML di destinazione.

Se un nodo non esiste, sarebbe fantastico se viene aggiunto, ma questo è forse un altro compito.

Il mio XML nel database:

<user>
  <username>username</username>
  <firstname>firstname</firstname>
  <lastname>lastname</lastname>
  <email>email@mail.de</email>
  <comment>comment</comment>
</user>

Il valore di $ user_xml:

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

La mia funzione finora:

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)
};

Prima di tutto non posso iterare su $user_xml/user. Se provo per iterare su $user_xml ottengo l'eccezione

arg1 non è di tipo node ()

Ma forse il suo approccio sbagliato in ogni caso?

Qualcuno forse ha il codice di esempio come fare questo?

È stato utile?

Soluzione

devo rispondere io stesso:

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)
};

, ma forse qualcuno ha una soluzione migliore per /user/*[fn:name() = fn:name($node)]?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top