【问题标题】:Marklogic - how to execute insert and node replace in single xqueryMarklogic - 如何在单个 xquery 中执行插入和节点替换
【发布时间】:2017-05-30 12:27:59
【问题描述】:

我提供了用于插入和节点替换查询的示例 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)  

【问题讨论】:

    标签: xpath xquery marklogic


    【解决方案1】:

    您不能在单个语句中做到这一点。您需要:

    1. 使用多语句调用(主语句用分号分隔)
    2. 在内存中进行更新,并将更新后的内容传递给插入

    关于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!

    【讨论】:

    • 感谢更新...如何?我只提供了示例查询,过去 2 天我一直在使用此查询,请您提供示例或更改上述查询。
    • 是的,但是我使用的是for循环,所以如果我存储内存,我无法存储内存,重复的内容将插入到相同的XML中。
    • 请更新问题以反映这一点,以便我们能够适当地回答..
    • 我已经添加了完整的 Xquery ,您能帮忙吗?
    • 是的,我已经对我的查询吐了口水。现在它工作正常,就像(关于 1)。
    【解决方案2】:

    根据 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

    【讨论】:

    • 但是我有框架 uri 并且在查询中使用了很多逻辑。那么还有其他替代方式吗?
    猜你喜欢
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多