Чтобы имитировать значение автоинкремента в 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
, 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 также очень приветствуются, но тогда см. Авто увеличить с помощью XQuery Update?)