XRX/自动递增文件 ID
外观
< XRX
您希望创建一个新文件并自动为该文件创建一个新的标识符。
创建一个包含单个计数器的 XML 文件。使用此计数器作为文件名的一部分。确认文件已保存后,使用更新函数递增计数器。
<data>
<next-id>47</next-id>
</data>
以下示例适用于传入的 HTTP POST 请求。
xquery version "1.0";
declare namespace exist = "http://exist.sourceforge.net/NS/exist";
declare namespace xmldb = "http://exist-db.org/xquery/xmldb";
declare namespace request="http://exist-db.org/xquery/request";
declare option exist:serialize "method=html media-type=text/html indent=yes";
(: save a new task - filename: save-new.xq - change base path if this changes. :)
(: this only works with POST data :)
let $my-doc := request:get-data()
(: the base directory URL for this XQuery. Use this to put links in the result page. :)
let $base-path := substring-before(request:get-url(), '/save-new.xq')
(: these paths must start with '/db' and are used for passing to doc() :)
let $data-collection := '/db/app/data'
let $next-id-file-path := '/db/app/edit/next-id.xml'
let $next-id := doc($next-id-file-path)/data/next-id/text()
(: use this as an arugment for for store command :)
let $new-term-base-file-name := concat($next-id, '.xml')
(: use this for doc :)
let $new-term-file-path := concat($data-collection, '/', $new-term-base-file-name)
(: add this line for testing in your local system or if you don't have group or RBAC set up :)
let $login := xmldb:collection($data-collection, 'mylogin', 'mypassword')
(: store the new document in the given collction :)
let $store-return-status := xmldb:store($data-collection, $new-term-base-file-name, $my-doc)
(: increment the next-id by one for the next document. You can also use "update value" :)
let $retCode1 := update replace doc($next-id-file-path)/data/next-id/text()
with ($next-id + 1)
(: note that next-id is now the next item so the current is next-id -1 :)
(: update the ID in the new document. Note that the saved document must have
the ID in the path /app/id. :)
let $retCode2 := update replace doc($new-term-file-path)/app/id with <id>{$next-id - 1}</id>
return
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Save Confirmation</title>
</head>
<body>
<h1>New file has been saved. id={$next-id - 1}.</h1>
</body>
</html>
与上面相同,但锁定包含标识符的节点。.
以下示例适用于传入的 HTTP POST 请求。
xquery version "1.0";
declare namespace exist = "http://exist.sourceforge.net/NS/exist";
declare namespace xmldb = "http://exist-db.org/xquery/xmldb";
declare namespace request="http://exist-db.org/xquery/request";
declare option exist:serialize "method=html media-type=text/html indent=yes";
(: save a new task - filename: save-new.xq - change base path if this changes. :)
(: this only works with POST data :)
let $my-doc := request:get-data()
(: the base directory URL for this XQuery. Use this to put links in the result page. :)
let $base-path := substring-before(request:get-url(), '/save-new.xq')
(: these paths must start with '/db' and are used for passing to doc() :)
let $data-collection := '/db/app/data'
let $next-id-file-path := '/db/app/edit/next-id.xml'
(: Get next-id current value and increment the node value with an exclusive lock of the node :)
let $next-id := util:exclusive-lock(
doc($next-id-file-path)/data/next-id,
let $current-id := doc($next-id-file-path)/data/next-id/text()
let $retCode := update replace doc($next-id-file-path)/data/next-id/text() with ($current-id + 1)
return ($current-id - 1))
(: Warning - Pitfall : $current-id evaluation changes after the update :)
(: use this as an arugment for for store command :)
let $new-term-base-file-name := concat($next-id, '.xml')
(: use this for doc :)
let $new-term-file-path := concat($data-collection, '/', $new-term-base-file-name)
(: add this line for testing in your local system or if you don't have group or RBAC set up :)
let $login := xmldb:collection($data-collection, 'mylogin', 'mypassword')
(: store the new document in the given collction :)
let $store-return-status := xmldb:store($data-collection, $new-term-base-file-name, $my-doc)
(: update the ID in the new document. Note that the saved document must have
the ID in the path /app/id. :)
let $retCode2 := update replace doc($new-term-file-path)/app/id with <id>{$next-id}</id>
return
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Save Confirmation</title>
</head>
<body>
<h1>New file has been saved. id={$next-id}.</h1>
</body>
</html>
请注意,插入属性的语法如下
update insert attribute {$attrName} {$attrValue} into expression
必须使用关键字 attribute,后面跟着属性名称和值。
如果您想将新 ID 存储在属性中,则语法为
update insert attribute {'id'} {$next-id} into $doc/root
注意:如果 attribute
已经在 目标节点
中存在,则 insert
的作用与 replace
相同。
如果您要更新 ID,可以使用带有 @ 的路径表达式中的 replace 函数。
update replace doc/root/@id with ($next-id + 1)