如何动态引用xdmp中的节点:MarkLogic中的node-replace?

时间:2013-07-02 08:12:28

标签: xquery marklogic

在我的函数 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文件和要更新的节点,并使用传入的信息更新节点。我必须忽略一些非常基本的东西或完全错误。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:5)

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

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

替换:

fn:doc($doc)/$path

使用:

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

HTH!