xdmp:node-replace
заменяет узлы в базе данных, а не в памяти.Также вы не можете видеть обновления базы данных перед фиксацией.
Простым решением было бы создать обновленный документ в памяти и вернуть его.
xquery version "1.0-ml";
xdmp:document-insert("abc.xml",
<root>
<id>abcd</id>
<name>Test</name>
</root>
);
let $doc := doc("abc.xml")
let $update :=
<root>
<id>1234</id>
{$doc/root/name}
</root>
return (
xdmp:document-insert("abc.xml", $update),
$update
)
Редактировать:
Альтернатива с использованием функции замены в памяти:
xquery version "1.0-ml";
import module namespace mem = "http://xqdev.com/in-mem-update" at '/MarkLogic/appservices/utils/in-mem-update.xqy';
let $doc := doc("abc.xml")
let $updatedDoc := mem:node-replace($doc//id, <id>1234</id>)
return (
xdmp:node-replace($doc, $updatedDoc),
$updatedDoc
)
С точки зрения производительности, я думаю, что мои и альтернативы Мадс Хансен имеют одинаковые характеристики производительности,Я бы сказал, выбрать то, что вам нравится больше всего.Я использовал свой подход для простых случаев использования обновлений много, для более сложных случаев использования, которые могут также включать перемещение узлов или около того, я бы предпочел использовать альтернативу Мадс Хансен XSLT.