2

我使用 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。我找了很久,没有成功,我不知道怎么办...

非常感谢

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 表达式(是的,这是一个 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>
于 2012-04-21T04:42:10.333 回答