我知道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无济于事 - 显然它不适合更改节点内的文本。对我而言,听起来非常奇怪,如此平庸和简单的事情变得如此难以实现。我显然错过了一些非常简单的东西。任何帮助都将非常感激。
答案 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)
。)