我刚开始使用MarkLogic和XQuery。我在修改我的一个XML文档的内容时非常艰难。我似乎无法改变要拾取的元素。这是我的过程(我必须尽可能地回收基本的东西,试着让它运转起来):
在查询控制台中,我打开了一个选项卡,用于查询一个XML文档的内容:
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
xdmp:document-get("C:/Users/Paul/Documents/MarkLogic/xml/ppl/ppl/jdbc_ppl_3790.xml")
这将文件带回如下
假 ... 3790
Victoria Wilson
</ppl_name>
我现在想要使用XQuery更新元素,但它没有发生。这是XQuery:
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
let $docxml :=
xdmp:document-get("C:/Users/Paul/Documents/MarkLogic/xml/ppl/ppl/jdbc_ppl_3065.xml")/document/meta/ppl_name
return
for $node in $docxml/*
let $target := xdmp:document-get("C:/Users/Paul/Documents/MarkLogic/xml/ppl/ppl/jdbc_ppl_3790.xml")/document/meta/*[fn:name() = fn:name($node)]
return
xdmp:node-replace($target, $node)
我基本上希望用来自源(3065)的ppl_name
元素替换目标(3790)中的ppl_name
元素。
我运行XQuery - 它完成没有错误(让我成功) - 返回值读取your query returned an empty sequence
。
然后我回到我在步骤1中使用的相同选项卡并重新运行步骤1中使用的XQuery。文档(3790)返回但它仍然是维多利亚威尔逊作为ppl_name
。< / p>
答案 0 :(得分:2)
xdmp:document-get
返回的节点是文件系统上文档的内存节点。它不是来自数据库。您不能在内存节点上使用xdmp:node-replace
。这仅适用于数据库驻留节点。
您可以使用xdmp:document-insert
插入它。然后它就在数据库中,您可以使用doc
访问它并使用xdmp:node-replace
进行更新。或者,您可以使用内存中的操作来构建具有所需更改的新版本。
有关类似问题的先前答案,请参阅What are in memory elements in marklogic?,以及更多提示。
答案 1 :(得分:1)
此处xdmp:document-get
返回的节点为in-memory node
如果您使用in memory elements
导入以下模块
import module namespace mem = "http://xqdev.com/in-mem-update" at "/MarkLogic/appservices/utils/in-mem-update.xqy";
您可以使用xdmp:node-replace
mem:node-replace(<x/>, <y/>)