XQuery:如何将大型 xml 文件拆分为较小的文件

XQuery: How to split large xml files into smaller ones

我们有非常大的数据文件,比如这个:

<itemList>
 <item>A1</item>
 <item>A2</item>
 <item>A3</item>
 <item>...</item>
 <item>A6000</item>
</itemList>

我们必须将它们分成更小的块,每个块大小为 1000。所以它看起来像这样:

<itemList>
 <itemSet>
  <item>A1</item>
  <item>...</item>
  <item>A1000</item>
 <itemSet>
 <itemSet>
  <item>...</item>

在 XQuery 中拆分它的最佳方法是什么?有什么想法吗?

非常感谢

我建议使用窗口查询:

<itemList>
{
    for tumbling window $items in $document/item
    start at $i when true()
    end at $j when $j eq $i + 999
    return
        <itemSet>
        {
                $items
        }
        </itemSet>
}
</itemList>

你可以用 Zorba 测试一下 here(我用的比较小 windows)

窗口式 for 循环是最佳答案(请参阅 Ghislain 的答案),但这仅在 XQuery 3 中可用,您的处理器可能不支持它。在这种情况下,您可以自己滚动,就像使用任何其他语言一样:

declare variable $itemList := <itemList>
 <item>A1</item>
 <item>A2</item>
 <item>A3</item>
 <item>A4</item>
 <item>A5</item>
 <item>A6</item>
 <item>A7</item>
 <item>A8</item>
</itemList>;
declare variable $groupSize := 3;

element itemList {
  for $group in (0 to fn:ceiling(count($itemList/item) div $groupSize) - 1)
  let $groupStart := ($group * $groupSize) +1
  let $groupEnd := ($group + 1) * $groupSize
  return
    element itemGroup {
      $itemList/item[$groupStart to $groupEnd]
    }
}