xpath导航具有同级的集合中的文档

xpath导航具有同级的集合中的文档,xpath,xquery,Xpath,Xquery,我在变量$data中收集了1000个TEI文档(注意:每个文档中最顶端的节点是TEI:TEI) 在Xpath中(在Xquery下),我可以输出所有带有以下内容的@type=“example”文档: let $coll := $data/tei:TEI[@type="example"] return $coll 然后,我可以从上述结果中进一步提取一个文档: let $coll := $data/tei:TEI[@type="example"] return $coll[@xml:id="TC00

我在变量
$data
中收集了1000个TEI文档(注意:每个文档中最顶端的节点是
TEI:TEI

在Xpath中(在Xquery下),我可以输出所有带有以下内容的
@type=“example”
文档:

let $coll := $data/tei:TEI[@type="example"]
return $coll
然后,我可以从上述结果中进一步提取一个文档:

let $coll := $data/tei:TEI[@type="example"]
return $coll[@xml:id="TC0005"]
以上工作很好

现在,我想在某个文档之前和之后获取文档,我假设可以使用
前面的同级
/
后面的同级

let $coll := $data/tei:TEI[@type="example"]
return ($coll[@xml:id="TC0005"]/preceding-sibling[1],
       $coll[@xml:id="TC0005"],
       $coll[@xml:id="TC0005"]/following-sibling[1])
但是,上面只返回
$coll[@xml:id=“TC0005”]
的文档

在集合中的文档之间导航时,此语法正确吗


非常感谢。

在文档节点的集合或序列中,您没有任何兄弟节点,兄弟节点只存在于每个文档树中,因此我认为您只需要以

let $examples := $data/tei:TEI[@type="example"]
for $example at $pos in $examples
where $example/@xml:id = 'TC0005'
return (
  $examples[$pos - 1],
  $example
  $examples[$pos + 1]
)

这是基于我对XQuery和XPath序列的理解,我希望它也适用于XQuery数据库中的集合。

这确实有效,谢谢。奇怪的是,它为
$pos-1
输出doc'TC0006',为
$pos+1
输出doc'TC0004',这与我的预期相反。您如何通过
收集功能获取
$data
?是否按特定顺序返回各种文档。我认为,如果
$data
是文档节点的集合,那么
$data/tei:tei[@type=“example”]
中的步骤
$data/tei:tei[@type=“example”]
可能确实会将使用顺序留给实现(使用
/
的步骤按文档顺序对一个文档中的节点进行排序,但不同文档中的节点没有预定义的顺序),因此,如果
$data
具有您期望的顺序,则最好只使用
let$examples:=$data!tei:tei[@type=“example”]
取而代之。是的,我通过collection函数获得
$data
,并且刚刚测试它以字母数字降序(文档标题)输出。而且我似乎无法通过
来覆盖此特定函数中的输出顺序。最好在一个新的单独问题中提出收集结果的顺序问题,即为数据库或XQuery处理器添加标记,我认为任何此类顺序都在很大程度上取决于特定的处理器。Co没错,集合中文档的顺序在很大程度上取决于处理器。事实上,有两种顺序不一定相同:collection()函数返回的序列中的项目顺序和“文档顺序”。