Marklogic - 如何在单个xquery中执行插入和节点替换

时间:2017-05-30 12:28:00

标签: xpath xquery marklogic

我为插入和节点替换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)  

2 个答案:

答案 0 :(得分:1)

你不能在一个声明中这样做。你要么:

  1. 使用多语句调用(用分号分隔的主语句)
  2. 在内存中进行更新,并将更新的内容传递给插入
  3. 关于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