为了学习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
)
答案 0 :(得分:1)
您无法将该部分的表达式分开,请将following-sibling::h2
视为一个单元。您可以改为:
let $x := doc("test.xq")//h2 return $x/following-sibling::h2
答案 1 :(得分:1)
这不是变量如何工作我害怕。看起来你正在尝试将变量声明视为一种“宏”并期望在引用变量时替换其文本定义,但实际上XQuery变量更像是C或Java中的局部变量 - 计算定义表达式以给出值或序列,当您引用该变量时,您将获得该值。
因此定义和引用表达式本身都需要是有效的表达式。如果您想将所有后续兄弟元素的列表存储在变量中,然后再过滤h2
元素,则需要类似
let $x := doc("test.xq")//h2/following-sibling::* return $x[self::h2]