爲了模擬XQuery更新的自動遞增值,下面的工作正常,運行這是第一次當假設<root count="0"/>
:
let $count := /root/@count
return (
insert node <node id='{ $count }'/> into /root,
replace value of node $count with $count + 1
)
...很好的收益:
<root count="1">
<node id="0">
</root>
然而,我想在我的Java代碼中定義節點,然後bind作爲org.w3c.dom.Node
或Document
,或者甚至String
。像:
String expr =
" declare variable $n external; "
+ " let $count := /root/@count; "
+ " return ("
+ " insert node $n into /root, "
+ " replace value of node $count with $count + 1 "
+ ") ";
XQConnection xqc = ...;
XQPreparedExpression xqp = xqc.prepareExpression(expr);
// org.w3c.dom.Node node is <node id='{ $count }'/>
xqp.bindNode(new QName("n"), node, null);
xqp.executeQuery();
然而,這只是讓我在屬性文本{ $count }
。將節點綁定爲xs:string
值具有相同的效果。
當然,這是對「XQuery注入」的很好保護。然後:是否有任何方法讓XQuery Update過程在變量本身中包含一個封閉的表達式?
(任何其他奇思妙想XQuery中使用自動增量值都非常歡迎過,但後來看到Auto increment with XQuery Update?)注射
啊,我不知道'basex:'函數。它會爲BaseX引入一個鎖定,但它可能確實是要走的路。我想我會先插入一個空節點來獲取'id = ...'固定的,然後在第二次調用數據庫更新時,用常規方式用實際用戶生成的數據來避免注入。或者,我也可以首先插入一個Java生成的UUID作爲id = ...的整個節點,然後在第二次調用數據庫時替換這個(已知的)UUID。 – Arjan
這[現在可能是'xquery:eval'](http://docs.basex.org/wiki/XQuery_Module)? *「該模塊在7.3版本中引入,功能已從廢棄的實用程序模塊中採用。」* – Arjan
啊,事實上'basex:'不再是了; BaseX 6.3.2發行說明狀態:* [ADD] XQuery:新的「db:」和「util:」函數,取代「basex:」* – Arjan