为了学习 XQuery,我尝试在 BaseX 中运行以下 XQuery 命令
let $x := doc("test.xq")//h2/following-sibling return $x::h2
我想它应该等同于
let $x := doc("test.xq")//h2/following-sibling::h2 return $x
但是它给出了以下错误并且在第二个命令有效时不起作用
Error:
Stopped at D:/Program Files/BaseX/data/test.xq, 1/66:
[XPST0003] Unexpected end of query: '::h2'.
一般来说,如何在变量提供的上下文中选择一些节点(
h2
)($x := doc("test.xq")//h2/following-sibling
)
恐怕这不是变量的工作方式。看起来您正在尝试将变量声明视为一种“宏”,并期望在引用变量时替换其文本定义,但实际上 XQuery 变量更像是 C 或 Java 中的局部变量 -评估定义表达式以给出一个值或序列,当您引用该变量时,您将获得该值。
所以定义和引用表达式都必须是有效的表达式。如果您想将所有后续同级元素的列表存储在变量中,然后稍后仅过滤
h2
元素,您需要像这样的东西
let $x := doc("test.xq")//h2/following-sibling::* return $x[self::h2]
那部分的表达不能分开,看
following-sibling::h2
为一个单位。您可以改为执行以下操作:
let $x := doc("test.xq")//h2 return $x/following-sibling::h2