【问题标题】:Marklogic - Trouble with mem-node-replaceMarklogic - 内存节点替换问题
【发布时间】:2018-02-27 13:20:30
【问题描述】:

我正在使用 mem:node-replace 来替换内容。但是它花费了太多时间。我遇到了 time-out 错误。 有什么替代方法吗?

查找示例 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)
)

【问题讨论】:

  • 您的代码 sn-p 没有显示 $id 的来源。它可能是空的,导致您在整个集合 $collection 上应用节点替换吗?
  • 所有参数我都传过了,这只是主要代码sn-p而已。

标签: xquery marklogic


【解决方案1】:

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

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

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

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

  • Ryan Dew 有一个类似的库https://github.com/ryanjdew/XQuery-XML-Memory-Operations,它的性能要好得多。它具有提供与 in-mem-update 库类似的编码风格的函数。
  • XSLT 性能非常好。您可以将xdmp:xslt-eval() 与本地XSLT 变量一起使用,或者将xdmp:xslt-invoke() 与已加载到Modules 数据库中的XSLT 一起使用。它的编程风格略有不同,但通常可以使用修改后的 identity transform 作为“推送风格”样式表,并为您需要进行的更改提供特定模板,从而更轻松地进行开发。
  • 一个recursive typeswitch

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

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

【讨论】:

    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2017-05-11
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多