在内存操作中 - 更新eXist-db中节点的值

时间:2018-02-03 15:08:40

标签: xml xquery exist-db

我知道eXist-db不支持内存更新/替换。我已经尝试了从文档/其他人的问题等设法理解的任何可能的路线。我只是希望能够在网络表单中编辑/添加一些文本,从xml索引中收集值,并发送该文本返回存储在索引中。我有一个人的数据库(索引):

<person xml:id="pe0005">
    <persName>
    <surname>Smith</surname>
    [...]
    </persName>
</person>
<person xml:id="pe0006">
    <persName>
    <surname>Abdul</surname>
    [...]
    </persName>
</person>
[...]

我的app.xql中有一个包含HTML表单的函数:

declare function app:persdetailsEdit($node as node(), $model as map(*), $searchkey as xs:string?)

{let $forename := doc(myfile))//tei:listPerson/tei:person[@xml:id=$searchkey]/tei:persName/tei:forename
let $peid := doc(myfile))//tei:listPerson/tei:person[@xml:id=$searchkey]/@xml:id

return
<div> 
<form action="update.xql" method="POST">  

Last name:<br/>
<input type="text" name="surname" value="{$surname}"/>
[...]
<input type="submit" value="Submit"/>

</form>
</div>};

在我的update.xql文件中(是​​否有办法将此代码放入app.xq?HTML抱怨'action'的内容必须是URI)我有类似

的内容
let $forename := request:get-parameter('forename', '')
let $peid := request:get-parameter('peid', '')
let $oldforename := doc(myfile)//tei:listPerson/tei:person[@xml:id=$peid]/tei:persName/tei:forename
[...]

抓取我要在.xml文件中更新的新值($forename),替换旧值($oldforename)。到现在为止还挺好。现在,

update value/replace $oldforename with $forename

是不可能的(它是内存中的操作)。显然,xmldb:update或xmldb:store没有任何帮助。我使用过ryanjdew的XQuery-XML-Memory-Operations-master无济于事 - 显然它不适合更改节点内的文本。对我而言,听起来非常奇怪,如此平庸和简单的事情变得如此难以实现。我显然错过了一些非常简单的东西。任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:1)

如果要更新存储在eXist数据库中的XML文件的内容,则这不是“内存中”操作;这是一个数据库操作。您只需使用eXist的XQuery Update facility即可。例如,在以下查询中,我们将创建一个内存节点,将其存储到磁盘,并执行磁盘版本的更新,返回原始内存节点和更新的磁盘上节点:

xquery version "3.1";

declare namespace tei="http://www.tei-c.org/ns/1.0";

let $in-memory := 
    <listPerson xmlns="http://www.tei-c.org/ns/1.0">
        <person xml:id="p1">
            <persName>Wolfgang</persName>
        </person>
        <person xml:id="p2">
            <persName>Dannes Wessels</persName>
        </person>
    </listPerson>
let $store := xmldb:store("/db", "listPerson.xml", $in-memory)
let $on-disk := doc("/db/listPerson.xml")
let $update := update value $on-disk//tei:person[@xml:id eq "p1"]/tei:persName with "Wolfgang Meier"
return
    (
        $in-memory,
        $on-disk
    )

此查询返回两个节点:

<listPerson xmlns="http://www.tei-c.org/ns/1.0">
    <person xml:id="p1">
        <persName>Wolfgang</persName>
    </person>
    <person xml:id="p2">
        <persName>Dannes Wessels</persName>
    </person>
</listPerson>

<listPerson xmlns="http://www.tei-c.org/ns/1.0">
    <person xml:id="p1">
        <persName>Wolfgang Meier</persName>
    </person>
    <person xml:id="p2">
        <persName>Dannes Wessels</persName>
    </person>
</listPerson>

因此,绝对可以更新磁盘节点。如果它不适合您,请提供经过修改的,自包含的工作示例。 (您显示的代码包含一些语法错误;例如doc(myfile)。)