我为插入和节点替换Query提供了示例Xquery。
我的问题是如果我要执行查询,它只会先插入XML。
即使我要第二次执行该节点也将被替换。
但我希望单次执行它也会被处理插入和更新。
sample query :
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
let $a := xdmp:document-insert("/fo.xml", <a>1</a>)
let $b := xdmp:node-replace(fn:doc("/fo.xml")/a, <b>1</b>)
return ($a,$b)
答案 0 :(得分:1)
你不能在一个声明中这样做。你要么:
关于1:
“应用程序开发人员指南”有一个关于Semi-Colon as a Statement Separator的部分,但简而言之,它归结为如下编写查询:
xquery version "1.0-ml";
xdmp:document-insert("/fo.xml", <a>1</a>)
;
xquery version "1.0-ml";
xdmp:node-replace(fn:doc("/fo.xml")/a, <b>1</b>)
关于2:
有些库提供的操作方法非常类似于xdmp:node- *,但是对尚未持久保存到数据库的内容进行操作。您需要先下载它们,然后将它们上传到您的模块数据库才能使用它们。我所知道的最好的版本是https://github.com/ryanjdew/XQuery-XML-Memory-Operations。您可以使用MLPM下载并安装它。使用该库,您可以编写如下内容:
import module namespace mem = "http://maxdewpoint.blogspot.com/memory-operations" at "/ext/mlpm_modules/XQuery-XML-Memory-Operations/memory-operations.xqy";
let $a := <a>1</a>
let $b := <b>1</b>
let $updated-a := mem:copy($a) ! (
mem:replace(., $a, $b),
mem:execute(.)
)
return xdmp:document-insert("/foo.xml", $updated-a)
HTH!
答案 1 :(得分:1)
根据grtjn的回答,您可以执行以下操作:
xdmp:document-insert("/fo.xml", <a>1</a>);
xdmp:node-replace(fn:doc("/fo.xml")/a, <b>1</b>);
注意行末尾的分号。这些是陈述分隔符。要了解有关语句分隔符(以及一般的转换)的更多信息,可以参考以下资源:https://docs.marklogic.com/guide/app-dev/transactions#id_11899。