捕获序列中的序列

capturing a sequence within a sequence

假设我有一系列项目,

<items>
    <item>B</item>
    <item>D</item>
    <item>A</item>
    <item>B</item>
    <item>C</item>
</items>

并且我想捕获 A 项和 B 项的所有序列

<items>
    <item>B</item>
    <item>D</item>
    <hit>
        <item>A</item>
        <item>B</item>
    </hit>
    <item>C</item>
</items>

这可以用 XQuery 完成吗?迭代时,上下文项是单数的。

我可以得到

<items>
    <item>B</item>
    <item>D</item>
    <hit-start><item>A</item></hit-start>
    <hit-end><item>B</item></hit-end>
    <item>C</item>
</items>

但这无济于事,

<items>
    <item>B</item>
    <item>D</item>
    <hit-start/>
        <item>A</item>
        <item>B</item>
    <hit-end/>
    <item>C</item>
</items>

您可以 "look around" 使用 preceding-siblingfollowing sibling

<items>{
  for $item in $xml/items/item
  return
    if ($item = "A" and $item/following-sibling::item[1] = "B")
    then (
      <hit-start/>,
      <item>A</item>,
      <item>B</item>,
      <hit-end/>
    )
    else
      $item[not(preceding-sibling::item[1] = "A")]
}</items>