BaseX XQuery error: root(): no context value bound

BaseX XQuery error: root(): no context value bound

我正在尝试 运行 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 之后的第一个标题,那么 select $x/following::*$y/preceding::*

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

如果你也有适合我需要的表达式,欢迎。

[...] to extract elements between two succeeding headings [...]

你需要更多类似的东西:

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

但它本身不会给您任何有用的东西,因为 XPath 和 XQuery 数据模型只有平面序列,而不是 "multi-dimensional arrays"。当你有一个 return 是每个 "iteration" 的值序列时,for 表达式的总体结果是所有结果序列的串联,因此写成在这个表达式之上,将简单地 return 您将每个 "section" 中的所有元素都放在一个平面列表中。如果你想按部分对元素进行分组,那么你需要为每个组构建一​​个新的 XML 元素

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

错误(如记录 here)来自这个表达式:

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

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

A / by itself selects the root node of the document containing the context node. If it is followed by a relative location path, then the location path selects the set of nodes that would be selected by the relative location path relative to the root node of the document containing the context node.

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

root(): no context value bound

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

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

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

这应该可以消除错误,但正如 Ian Roberts 所写,它不会给您想要的结果。请参阅他的回答。