XQuery - 仅检索部分信息

时间:2012-04-20 19:55:54

标签: filter limit xquery

我使用XQuery来做统计。我有一个这样的文件:

<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)。

在这个例子中,理想输出只有前三个元素,如:

<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。我找了很久,没有成功,我找不到怎么做......

非常感谢

1 个答案:

答案 0 :(得分: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表达式(是的,这是一个XQuery表达式也是一个XPath 2.0表达式)根据提供的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>