0

在我的函数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 个参数,第一个参数是 XML 源文件的路径,第二个参数是 XML 文件中要更新的节点的路径,其余的对应于子元素值。

当我调用xdmp:node-replace更新数据时,遇到以下错误:

500内部服务器错误

XDMP-ARGTYPE: (err: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:node-replace(fn:doc("/content/Users/Tako/Sites/MarkLogic/xml/worldcities/import/cities1000_02.xml")/cities/city[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:node-replace(fn:doc("/content/Users/Tako/Sites/MarkLogic/xml/worldcities/import/cities1000_17.xml")/cities/city[3961], JPMiyoshi56958) -- 时间超出限制 ...

我要做的就是动态引用 XML 文件和要更新的节点,并使用传入的信息更新节点。我必须忽略一些非常基本的东西,或者这样做完全错误。

有人可以解释一下吗?

4

1 回答 1

6

在您的第一个解决方案中,您将字符串值应用于由fn:doc($doc). 这样,您最终只会得到$xpath本身的字符串值。第二种解决方案也有效地采用了$xpath的值,并尝试对其进行评估。这很可能会产生很多可能都被更新的节点。

我不完全确定你为什么会得到XDMP-UPEXTNODES和超时,但以下应该做..

代替:

fn:doc($doc)/$path

和:

xdmp:value(fn:concat("fn:doc($doc)", $path))

于 2013-07-02T08:51:38.737 回答