不对数据库中的XML文档进行修改

时间:2014-08-02 00:02:19

标签: xquery marklogic

我刚开始使用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>

2 个答案:

答案 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/>)