我试图在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::*
但是我不确定我的表达是否有效,但我的问题是如何在没有错误的情况下执行我的预期查询?
如果你还有一个适合我需要的表达,那就很受欢迎了。
答案 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写的那样,它不会给你想要的结果。看到他的答案。