我可以XQuery的评估与XQJ约束变量在{$表达式冲?(Can I make XQuery eva

2019-10-17 07:20发布

为了模拟在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代码,然后绑定 ,作为一个org.w3c.dom.NodeDocument ,甚至是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更新自动递增? )

Answer 1:

说到注射的......为什么不直接通过该节点作为一个字符串,并使用basex:eval()函数?

String node = "<node id='{ $count }'/>";
String expr =
   ...
   + "   insert node xquery:eval($n) into /root, "
   ...

上面xquery: 指BaseX模块 。



Answer 2:

该变换表达的XQuery更新可以帮助你在这里。 它可以用来修改主存储器中的现有节点。 你举的例子可以改写如下:

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属性,而不是替换假的..

  copy $c := $n
  modify insert node attribute id { $count } into $c/node
  return $c

transform表达式的当前语法是一个东西需要去适应第一。 一个更好的可读的语法可能会受到官方规范的未来版本。



文章来源: Can I make XQuery evaluate { $expression } within variables bound with XQJ?