我正在尝试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>在我的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>例如,将4张纸分组到一组,将另外4张分组到一组,最后将它们中的其余部分分组到一组
发布于 2014-11-25 06:10:55
如果您有可用的XQuery 3.0,您可以使用tumbling window非常容易地实现这一点:
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表达式和位置谓词:
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>发布于 2014-11-25 04:06:18
您可以使用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>XQuery (**$groupSize** 传入为 4**)**
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输出
<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>https://stackoverflow.com/questions/27112864
复制相似问题