aggiornando più nodi XML con XQuery e xdmp: nodo sostituire
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?
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