首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对xml元素进行分组的XQuery

对xml元素进行分组的XQuery
EN

Stack Overflow用户
提问于 2014-11-25 03:43:05
回答 2查看 95关注 0票数 0

我正在尝试xquery中的一些分组

代码语言:javascript
复制
<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>

在我的xquery中,我想传递一个动态值,比如数字4……我希望我的xml将4个工作表元素分组到一个集合中,如下所示

代码语言:javascript
复制
<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>

例如,将4张纸分组到一组,将另外4张分组到一组,最后将它们中的其余部分分组到一组

EN

回答 2

Stack Overflow用户

发布于 2014-11-25 06:10:55

如果您有可用的XQuery 3.0,您可以使用tumbling window非常容易地实现这一点:

代码语言:javascript
复制
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>

否则,如果您只有FLWOR1.0可用,那么您可以使用一个简单的XQuery表达式和位置谓词:

代码语言:javascript
复制
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>
票数 1
EN

Stack Overflow用户

发布于 2014-11-25 04:06:18

您可以使用subsequence()并递归调用函数。

例如。

XML输入

代码语言:javascript
复制
<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>

XQuery (**$groupSize** 传入为 4**)**

代码语言:javascript
复制
declare variable $groupSize external;

declare function local:group($set as node()*, $size as xs:integer) as item()* {
    <set>{subsequence($set,1,$size)}</set>,
    if (count($set)>$groupSize) then
        local:group(subsequence($set,$groupSize+1),$groupSize)
    else
        ()
};

<Sheets>{local:group(/*/*,$groupSize)}</Sheets>

XML输出

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27112864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档