首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能让XQuery在与XQJ绑定的变量中计算{ $expression }吗?

我能让XQuery在与XQJ绑定的变量中计算{ $expression }吗?
EN

Stack Overflow用户
提问于 2012-10-02 20:40:55
回答 2查看 1.4K关注 0票数 0

要在XQuery更新中模拟自动增量值,以下内容可以正常工作,在第一次运行此值时假设为<root count="0"/>

代码语言:javascript
复制
let $count := /root/@count
return (
  insert node <node id='{ $count }'/> into /root,
  replace value of node $count with $count + 1  
)

...nicely产量:

代码语言:javascript
复制
<root count="1">
  <node id="0">
</root>

但是,我想在我的Java代码中定义节点,然后将绑定定义为org.w3c.dom.NodeDocument,甚至是String。比如:

代码语言:javascript
复制
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更新?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-02 22:42:14

说到injection...why,不仅仅是将节点作为字符串传递并使用basex:eval()?

代码语言:javascript
复制
String node = "<node id='{ $count }'/>";
String expr =
   ...
   + "   insert node xquery:eval($n) into /root, "
   ...

上图,xquery: 指BaseX模块

票数 2
EN

Stack Overflow用户

发布于 2012-11-03 18:18:16

变换表达式 of XQuery更新可能在这里帮助您。它可以用于修改主内存中的现有节点。您的示例可以重写如下:

代码语言:javascript
复制
declare variable $n external;

let $count := /root/@count
let $n :=
  copy $c := $n
  modify replace value of node $c/node/@id with $count
  return $c
return (
  insert node $n into /root,
  replace value of node $count with $count + 1
)

将外部节点$n复制到变量$c,并将根节点的@id属性替换为$count的当前值。

当然,这种方法有许多变体。例如,可以插入一个新的@id属性,而不是替换虚拟的。

代码语言:javascript
复制
  copy $c := $n
  modify insert node attribute id { $count } into $c/node
  return $c

转换表达式的当前语法首先需要适应。一个更好的可读语法可能受制于官方规范的未来版本。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12697957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档