2

私はXQueryを使用して統計を行います。私はこのような1つのドキュメントを持っています:

<tr>
  <td>Element 1</td>
  <td>100</td>
</tr>
<tr>
  <td>Element 2</td>
  <td>80</td>
</tr>
<tr>
  <td>Element 3</td>
  <td>40</td>
</tr>
<tr>
  <td>Element 4</td>
  <td>12</td>
</tr>
<tr>
  <td>Element 5</td>
  <td>8</td>
</tr>

そして、このドキュメントの一部のみを取得したい:要素数の合計の80%のみを取得したい(実際にはパレート分布)。

この場合、合計240個の要素があります。要素の合計が192(240 * 80/100)になるように、出力に最初の要素が必要です。

この例では、理想的な出力には、次のように最初の3つの要素のみが含まれます。

<tr>
  <td>Element 1</td>
  <td>100</td>
</tr>
<tr>
  <td>Element 2</td>
  <td>80</td>
</tr>
<tr>
  <td>Element 3</td>
  <td>40</td>
</tr>

私は明確だと思います:s。私は長い間探していますが、成功せず、方法がわかりません...

ありがとうございます

4

1 に答える 1

3

使用

   for $total in sum(/*/*/td[2]),
        $pareto in $total*80 div 100,
        $i in 1 to count(/*/*)
      return
        if(sum(/*/*[position() le $i]/td[2]) ge $pareto
         and
           sum(/*/*[position() lt $i]/td[2]) lt $pareto
           )
           then /*/*[position() le $i]
           else ()

このXPath式(はい、これはXPath 2.0式でもあるXQuery式です)が提供されたXMLに対して評価される場合(単一のtope要素にラップされて整形式のXMLドキュメントになります):

<table>
    <tr>
        <td>Element 1</td>
        <td>100</td>
    </tr>
    <tr>
        <td>Element 2</td>
        <td>80</td>
    </tr>
    <tr>
        <td>Element 3</td>
        <td>40</td>
    </tr>
    <tr>
        <td>Element 4</td>
        <td>12</td>
    </tr>
    <tr>
        <td>Element 5</td>
        <td>8</td>
    </tr>
</table>

必要な正しい結果が生成されます:

<tr>
    <td>Element 1</td>
    <td>100</td>
  </tr>
<tr>
    <td>Element 2</td>
    <td>80</td>
  </tr>
<tr>
    <td>Element 3</td>
    <td>40</td>
</tr>
于 2012-04-21T04:42:10.333 に答える