XQuery将xml元素分组

XQuery将xml元素分组,xquery,Xquery,我尝试在xquery中进行分组 <Sheets> <Sheet> <ROI>5350</ROI> <TPI>830</TPI> </Sheet> <Sheet> <ROI>5459</ROI> <TPI>830</TPI> </Sheet>

我尝试在xquery中进行分组

<Sheets>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5459</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5678</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>17473</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>857</TPI>
    </Sheet>
    <Sheet>
        <ROI>5713</ROI>
        <TPI>857</TPI>
    </Sheet>
</Sheets>

5350
830
5459
830
5350
856
5678
856
17473
856
5350
857
5713
857
在我的xquery中,我想传递一个动态值,比如数字4。。。我希望我的xml将4个表元素分组到一个集合中,如

<Sheets>
    <set>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5459</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5678</ROI>
        <TPI>856</TPI>
    </Sheet>
    </set>
    <set>
    <Sheet>
        <ROI>17473</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>857</TPI>
    </Sheet>
    <Sheet>
        <ROI>5713</ROI>
        <TPI>857</TPI>
    </Sheet>
    </set>
</Sheets>

5350
830
5459
830
5350
856
5678
856
17473
856
5350
857
5713
857

例如,将4张图纸分成一组,将其他4张图纸分成一组,最后将其余的图纸分成一组。您可以使用
subsequence()
递归调用函数

例如

XML输入

<Sheets>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5459</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5678</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>17473</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>857</TPI>
    </Sheet>
    <Sheet>
        <ROI>5713</ROI>
        <TPI>857</TPI>
    </Sheet>
</Sheets>
<Sheets>
   <set>
      <Sheet>
        <ROI>5350</ROI>
        <TPI>830</TPI>
      </Sheet>
      <Sheet>
        <ROI>5459</ROI>
        <TPI>830</TPI>
      </Sheet>
      <Sheet>
        <ROI>5350</ROI>
        <TPI>856</TPI>
      </Sheet>
      <Sheet>
        <ROI>5678</ROI>
        <TPI>856</TPI>
      </Sheet>
   </set>
   <set>
      <Sheet>
        <ROI>17473</ROI>
        <TPI>856</TPI>
      </Sheet>
      <Sheet>
        <ROI>5350</ROI>
        <TPI>857</TPI>
      </Sheet>
      <Sheet>
        <ROI>5713</ROI>
        <TPI>857</TPI>
      </Sheet>
   </set>
</Sheets>
XML输出

<Sheets>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5459</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5678</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>17473</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>857</TPI>
    </Sheet>
    <Sheet>
        <ROI>5713</ROI>
        <TPI>857</TPI>
    </Sheet>
</Sheets>
<Sheets>
   <set>
      <Sheet>
        <ROI>5350</ROI>
        <TPI>830</TPI>
      </Sheet>
      <Sheet>
        <ROI>5459</ROI>
        <TPI>830</TPI>
      </Sheet>
      <Sheet>
        <ROI>5350</ROI>
        <TPI>856</TPI>
      </Sheet>
      <Sheet>
        <ROI>5678</ROI>
        <TPI>856</TPI>
      </Sheet>
   </set>
   <set>
      <Sheet>
        <ROI>17473</ROI>
        <TPI>856</TPI>
      </Sheet>
      <Sheet>
        <ROI>5350</ROI>
        <TPI>857</TPI>
      </Sheet>
      <Sheet>
        <ROI>5713</ROI>
        <TPI>857</TPI>
      </Sheet>
   </set>
</Sheets>

5350
830
5459
830
5350
856
5678
856
17473
856
5350
857
5713
857

如果您有可用的XQuery 3.0,可以使用
翻滚窗口
轻松实现这一点:

xquery version "3.0";

let $group-size := 4  (: set your group size here :)
return

    <Sheets>
    {
       for tumbling window $window in /Sheets/Sheet
       start at $start when fn:true()
       end at $end when $end - $start eq $group-size - 1
       return
           <set>{$window}</set>
    }   
    </Sheets>
xquery版本“3.0”;
让$group size:=4(:在此处设置组大小:)
返回
{
用于翻转窗口$window in/Sheets/Sheet
fn:true()时从$start开始
在$end时结束$end-$start eq$组大小-1
返回
{$window}
}   
否则,如果只有XQuery 1.0可用,则可以使用简单的FLWOR表达式和位置谓词:

xquery version "1.0";

let $group-size := 4  (: set your group size here :)
return

    <Sheets>
    {
        for $group in (1 to round(count(/Sheets/Sheet) div $group-size) cast as xs:integer)
        let $start := (1 * ($group - 1) * $group-size) + 1
        let $end := $group * $group-size
        return
            <set>{/Sheets/Sheet[position() ge $start][position() le $end]}</set>
    }
    </Sheets>
xquery版本“1.0”;
让$group size:=4(:在此处设置组大小:)
返回
{
对于$group in(1到四舍五入(计数(/Sheets/Sheet)div$group size),强制转换为xs:integer)
让$start:=(1*($group-1)*$group size)+1
设$end:=$group*$group size
返回
{/Sheets/Sheet[position()ge$start][position()le$end]}
}