为了模拟 XQuery Update 中的自动增量值,假设<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 代码中定义节点,然后将其绑定为org.w3c.dom.Node
or 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 更新过程成为我在变量本身中包含的表达式?
(在 XQuery 中使用自动增量值的任何其他聪明的想法也非常受欢迎,但是请参阅Auto increment with XQuery Update?)