在内存操作中——更新 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)
。)
我知道 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)
。)