BaseX XQuery错误:root():没有绑定上下文值

时间:2015-06-09 15:02:06

标签: xpath xquery grouping basex

我试图在BaseX中运行以下XQuery表达式来提取两个后续标题之间的元素。 (作为文章部分)。

xquery for $x in doc("test.xq")//h2, 
$y in $x/following-sibling::h2[1]  
return //*[$x/following::* and $y/preceding::*]

但它给出了错误

Error:
Stopped at D:/Program Files/BaseX/data/test.xq, 1/74:
[XPDY0002] root(): no context value bound.

我的意思是$x是标题,而$y是$ x后的第一个标题,请选择$x/following::*$y/preceding::*

但是我不确定我的表达是否有效,但我的问题是如何在没有错误的情况下执行我的预期查询?

如果你还有一个适合我需要的表达,那就很受欢迎了。

2 个答案:

答案 0 :(得分:3)

  

[...]在两个连续标题之间提取元素[...]

你需要更像的东西:

for $x in doc("test.xq")//h2
return $x/following-sibling::*[preceding-sibling::h2[1] is $x]

但就其本身而言,它不会给你任何有用的东西,因为XPath和XQuery数据模型只有平面序列,而不是“多维数组”。当你有一个for为每个“迭代”返回一个值序列时,for表达式的整体结果是所有结果序列的串联,所以如上所述,这个表达式将只返回您在单个平面列表中的每个“部分”中的所有元素。如果要按部分对元素进行分组,则需要为每个组构建一​​个新的XML元素

for $x in doc("test.xq")//h2
return
  <section>{$x/following-sibling::*[preceding-sibling::h2[1] is $x]}</section>

答案 1 :(得分:1)

错误(记录为here)来自此表达式:

//*[$x/following::* and $y/preceding::*]

//开头。缩写//代表/descendant-or-self::node()/,当然以/开头。 XPath标准says

  

A /本身选择包含的文档的根节点   上下文节点。如果它后跟一个相对位置路径,那么   位置路径选择将由其选择的节点集   相对于文档的根节点的相对位置路径   包含上下文节点

但是从您向我们展示的内容来看,没有任何迹象表明您已经建立了一个上下文节点。因此,XPath无法知道哪个文档包含上下文节点。这就是错误消息在引用

时引用的内容
root(): no context value bound

要修复错误,您可以在//之前使用明确的doc(...)或任何其他明确的方式设置上下文:

doc("test.xq")//*[$x/following::* and $y/preceding::*]

root($x)//*[$x/following::* and $y/preceding::*]

这应该摆脱错误,但正如Ian Roberts写的那样,它不会给你想要的结果。看到他的答案。