XQuery/保存和更新数据
外观
< XQuery
您有一些需要将数据保存到数据库的 Web 表单(例如 XForms)。您希望使用单个 XQuery 来保存新数据并更新现有数据。如果表单用于更新现有记录,您可以假设它在要保存的 XML 文档中有一个 <id> 标记。新文档需要为它们创建新的文档 ID。
我们使用 HTTP POST 数据并扫描特定元素,例如 id。如果记录没有 id 元素,我们知道我们必须创建新记录。请注意,此示例中尚未生成序列号。如果存在id参数,我们将删除旧文件并将新数据保存到同一文件中。请注意,没有备份或存档。
xquery version "1.0";
declare namespace exist = "http://exist.sourceforge.net/NS/exist";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace xmldb="http://exist-db.org/xquery/xmldb";
declare option exist:serialize "method=xhtml media-type=text/xml indent=yes";
(: Call this like this:
For new records:
https://127.0.0.1:8080/exist/rest/db/xquery-examples/save-test/new-update-save.xq?new=true
For updates where each record has an id:
https://127.0.0.1:8080/exist/rest/db/xquery-examples/save-test/new-update-save.xq?id=123
:)
(: replace this with your document, for example use request:get-data() :)
let $my-doc :=
<data>
<id>123</id>
<message>Hello World</message>
</data>
let $id := $my-doc/id
let $collection := 'xmldb:exist:///db/xquery-examples/save-test'
(: this logs you in; you can also get these variables from your session variables :)
let $login := xmldb:login($collection, 'mylogin', 'my-password')
(: replace this with a unique file name with a sequence number :)
let $file-name := 'test-save.xml'
return
<results>{
if (not($id))
then (
let $store-return-status := xmldb:store($collection, $file-name, $my-doc)
return
<message>New Document Created {$store-return-status} at {$collection}/{$file-name}</message>
)
else (
let $remove-return-status := xmldb:remove($collection, $file-name)
let $store-return-status := xmldb:store($collection, $file-name, $my-doc)
return
<message>Document {$id} has been successfully updated</message>)
}</results>
有时您不想创建新的 XML 文件,而只是将结果保存到现有 XML 文件的末尾。这可以使用 XQuery 更新操作来完成。
eXist 1.2/1.3/1.4/1.5 中 XQuery 更新操作的语法
例如,在 eXist 1.2/1.3/1.4 中,操作语法如下
let $append-result := update insert <item/> into doc("myfile.xml")/items