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



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

<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抱怨"操作"的内容必须是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无济于事 - 显然它不适合更改节点内的文本。对我来说,如此平庸和简单的事情竟然如此难以实现,这听起来很奇怪。我显然错过了一些超级简单的东西。任何帮助将不胜感激。

如果要更新存储在 eXist 数据库中的 XML 文件的内容,这不是"内存中"操作;而是数据库操作。您可以简单地使用eXist的XQuery Update工具。例如,在下面的查询中,我们将创建一个内存中节点,将其存储到磁盘,并对磁盘版本执行更新,返回原始内存中节点和更新的磁盘节点:

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

最新更新