Marklogic - mem-node-replace问题

时间:2018-02-27 13:20:31

标签: xquery marklogic

我正在使用 mem:node-replace 来替换内容。但这花费了太多时间。我遇到了超时错误。 有没有替代方案呢?

找到Sample Xquery:

xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
import module namespace mem = "http://xqdev.com/in-mem-update" 
  at '/MarkLogic/appservices/utils/in-mem-update.xqy';


let $uri := cts:uri-match((concat('*',$id ,'*')),(),cts:collection-query($collection))
let $data := doc($uri)
let $final := mem:node-replace($data//title[@id='2'],doc($uri1)//title[@id='2'])
return (
  xdmp:document-insert('/test/sample.xml',$final)
)

1 个答案:

答案 0 :(得分:4)

mem:node-replace()不是修改内容的最有效方式。

如果您的文档已经在数据库中,并且您只想替换节点,则无需使用in-mem-update库。

您应该使用xdmp:node-replace()

对于更复杂的转换,您还可以考虑以下内存转换选项:

  • Ryan Dew有一个类似的库https://github.com/ryanjdew/XQuery-XML-Memory-Operations,表现得更好。它具有为内存更新库提供类似编码风格的功能。
  • XSLT表现非常出色。您可以将xdmp:xslt-eval()与本地XSLT变量一起使用,或将xdmp:xslt-invoke()与已加载到Modules数据库中的XSLT一起使用。这是一种稍微不同的编程风格,但通常可以使用修改后的identity transform作为"推送风格"更加简单地开发和开发。样式表,其中包含您需要进行更改的特定模板。
  • A recursive typeswitch

如果您需要修改大量文档,那么如果您尝试在单个模块执行中完成所有操作,则仍可能会遇到超时问题。

您应该使用批处理工具管理批量文档更改,例如: