在我的函数 update-replace 中,我试图通过调用xdmp:node-replace
来动态替换MarkLogic中某个XML数据源文件中的XML节点,如下所示:
declare function update-lib:update-rec($doc as xs:string, $path as xs:string, $country as xs:string, $name as xs:string, $population as xs:integer, $latitude as xs:decimal, $longitude as xs:decimal) as document-node() {
(: read lock acquired :)
fn:doc($doc),
xdmp:node-replace(fn:doc($doc)/$path,
<city>
<country>{$country}</country>
<name>{$name}</name>
<population>{$population}</population>
<latitude>{$latitude}</latitude>
<longitude>{$longitude}</longitude>
</city>
),
(: after the following statement, txn ends and locks released :)
xdmp:commit()
};
该函数接受7个参数,第一个arg是XML源文件的路径,第二个是XML文件中要更新的节点的路径,其余的对应于子元素值。
当我致电xdmp:node-replace
更新数据时,我遇到以下错误:
500内部服务器错误
XDMP-ARGTYPE :(错误:XPTY0004)xdmp:node-replace(“/ cities / city [3961]”, JPMiyoshi56958) - arg1不是node()...
类型
所以我决定对arg1进行评估,以确保node()作为node-replace的第一个arg传递:
xdmp:node-replace(xdmp:eval(fn:doc($doc)/$path),
<city>
<country>{$country}</country>
<name>{$name}</name>
<population>{$population}</population>
<latitude>{$latitude}</latitude>
<longitude>{$longitude}</longitude>
</city>
),
现在我收到以下错误:
XDMP-UPEXTNODES: xdmp:节点替换(FN:DOC( “/内容/用户/章鱼/站点/ MarkLogic / XML / worldcities /进口/ cities1000_02.xml”)/城市/城市的[3961], JPMiyoshi56958) - 无法更新外部节点...
经过一番谷歌搜索后,我发现了这一点。这听起来像是xdmp:eval
及其背景的问题:
http://developer.marklogic.com/pipermail/general/2008-September/001753.html
我尝试使用fn:concat
建议的解决方法将所有内容构造为包含xdmp:node-replace
的字符串并评估整个语句。
xdmp:eval(fn:concat('xdmp:node-replace(fn:doc("', $doc, '")', $path,
', ', '<city><country>',$country,'</country><name>',$name,'</name><population>',$population,'</population><latitude>',$latitude,'</latitude><longitude>',$longitude,'</longitude></city>', ')')),
当我尝试这个时,应用程序会等待很长时间才会超时。 500内部服务器错误
SVC-EXTIME: xdmp:节点替换(FN:DOC( “/内容/用户/章鱼/站点/ MarkLogic / XML / worldcities /进口/ cities1000_17.xml”)/城市/城市的[3961], JPMiyoshi56958) - 超出时限......
我想要做的就是动态引用XML文件和要更新的节点,并使用传入的信息更新节点。我必须忽略一些非常基本的东西或完全错误。
有人可以解释一下吗?
答案 0 :(得分:5)
在第一个解决方案中,您将字符串值应用于fn:doc($doc)
返回的每个文档节点。这样你只能得到 $ xpath 本身的字符串值。第二个解决方案也有效地获取了 $ xpath 的值,并尝试对其进行评估。这很可能会产生很多可能都在更新的节点。
我不完全确定你为什么会得到 XDMP-UPEXTNODES 和超时,但以下情况应该做..
替换:
fn:doc($doc)/$path
使用:
xdmp:value(fn:concat("fn:doc($doc)", $path))
HTH!