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

Xpath BaseX XQuery错误:root():没有上下文值绑定,xpath,xquery,grouping,basex,Xpath,Xquery,Grouping,Basex,我试图在BaseX中运行以下XQuery表达式,以提取两个后续标题之间的元素。(作为条款部分) 但它给出了错误 Error: Stopped at D:/Program Files/BaseX/data/test.xq, 1/74: [XPDY0002] root(): no context value bound. 通过表达式,我的意思是如果$x是标题,$y是$x后面的第一个标题,那么为$x/后面的::*和$y/前面的::* 然而,我不确定我的表达式是否有效,但我这里的问题是,如何能够执行预

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

但它给出了错误

Error:
Stopped at D:/Program Files/BaseX/data/test.xq, 1/74:
[XPDY0002] root(): no context value bound.
通过表达式,我的意思是如果
$x
是标题,
$y
是$x后面的第一个标题,那么为
$x/后面的::*
$y/前面的::*

然而,我不确定我的表达式是否有效,但我这里的问题是,如何能够执行预期的查询而不出错

如果你也有一个表达我的需要,这是欢迎的

[…]提取两个后续标题之间的元素[…]

你需要的东西更像:

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>
用于文档中的$x(“test.xq”)//h2
返回
{$x/后面的兄弟姐妹::*[前面的兄弟姐妹::h2[1]是$x]}
错误(如文件所述)来自以下表达式:

//*[$x/following::* and $y/preceding::*]
它以
/
开头。缩写
/
代表
/genderant或self::node()/
,当然它以
/
开头。XPath标准:

A/本身选择包含 上下文节点。如果后跟相对位置路径,则 位置路径选择将由用户选择的节点集 相对位置相对于文档根节点的路径 包含上下文节点

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

root(): no context value bound
要修复此错误,可以在
/
之前使用显式
文档(…)
或任何其他显式方式设置上下文:

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


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

您可能需要使用
分组依据
(),例如
分组依据前面的兄弟姐妹::h2[1]
。谢谢。您的意思是,如果查询不是通过变量追溯到根,那么应该指定文档?你的答案和Ian是互补的,回答了这个问题,不知道接受哪个。Ahmad,如果没有上下文节点,那么你就不能使用以
/
开头的XPath表达式。您可以使用
doc(…)/…
,或者
root($x)/…
,或者类似的东西。你问了两个问题;我回答了第一个问题,伊恩回答了第二个问题。我怀疑伊恩的回答对你更有实际价值。如果你接受他的建议,我不会反对。:-)非常感谢。您的答案和@LarsH是互补的,您可能希望在您的答案中包含部分内容或说明他的答案。在我询问错误来源之前,我有一个类似的问题,其中要求对部分设置另一个条件,请您也检查一下,抱歉,如果我看起来太天真的话
doc("test.xq")//*[$x/following::* and $y/preceding::*]
root($x)//*[$x/following::* and $y/preceding::*]