2014-11-24 84 views
0

我在我嘗試的XQuery XQuery中XQuery來組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> 

一些分組,我想通過一個動態值數說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一組,最後剩下他們中的一個設置

回答

0

你可以使用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($groupSize4通過)

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> 
1

如果你的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> 

否則,如果你只擁有的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>