обновление нескольких узлов в xml с помощью xquery и xdmp: node-replace - PullRequest
3 голосов
/ 22 декабря 2010

Я хочу обновить XML-документ в моей базе данных XML (Marklogic).У меня есть 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 ()

Но, может быть, это неправильный подход?

Кто-нибудь может иметь пример кода, как это сделать?

1 Ответ

5 голосов
/ 22 декабря 2010

Я должен ответить сам:

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

...