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://:8080/exist/rest/db/xquery-examples/save-test/new-update-save.xq?new=true
For updates where each record has an id:
https://: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