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

In memory operations - updating the value of a node in eXist-db

我知道 eXist-db 不支持内存 updating/replacing。我已经尝试了我从 documentation/other 人的问题等中设法理解的任何可能途径。我只是希望能够 edit/add 网络表单中的一些文本,该文本从 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
[...]

获取新值 ($forename) 我想在我的 .xml 文件中更新,替换旧值 ($oldforename)。到目前为止,一切都很好。现在,

update value/replace $oldforename with $forename

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

如果您正在更新存储在 eXist 数据库中的 XML 文件的内容,这不是 "in-memory" 操作;这是一个数据库操作。您可以简单地使用 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
    )

本次查询returns两个节点:

<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)。)