Filter XQuery-仅检索部分信息

Filter XQuery-仅检索部分信息,filter,limit,xquery,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&l

我使用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>
<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>

要素1
100
要素2
80
要素3
40
要素4
12
要素5
8.
我只想检索这个文档的一部分:我只想得到元素数之和的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>
<tr>
  <td>Element 4</td>
  <td>12</td>
</tr>
<tr>
  <td>Element 5</td>
  <td>8</td>
</tr>
<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>

要素1
100
要素2
80
要素3
40
我希望我清楚:s。我找了很久,没有成功,我不知道该怎么办

非常感谢

使用

   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 ()
<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>
当根据提供的XML(包装到单个tope元素中,使其成为格式良好的XML文档)计算此XPath表达式(是的,这是一个XQuery表达式,也是一个XPath 2.0表达式)时:

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

要素1
100
要素2
80
要素3
40
要素4
12
要素5
8.
生成所需的正确结果

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

要素1
100
要素2
80
要素3
40

对不起,我不太清楚。如果希望元素总数为192,为什么选择前3个元素,其总数为100+80+40=220?也许您可以澄清您希望对这5个节点应用哪种类型的过滤器?(另外,关于你的问题,有一点让人困惑,那就是“元素”在XML中有一个特定的含义,不清楚你使用的“元素”是XML意义上的,还是其他意义上的。)我也很难理解这个问题。我选择前3个元素,因为如果我选择前2个元素,总数是180,低于80%,但是这不是很重要(一个只有这两个元素的输出也是正确的)。如果你不喜欢我的元素'element'的名称,用'tagazoc'替换它们,这只是这个例子(我同意非常糟糕的选择…)我只想在输出中,'tagazoc'标记的总和是实际总数的80%…哇,非常强大。。。有一件事,为什么在for循环中声明变量“total”和“Pareto”?如果在前面声明了它们,那就不一样了?@WaZaA:在XQuery中,这两种定义变量的方法是等价的(如果给它们的值是非序列的)。在XPath 2.0中,定义变量的唯一方法是使用“for”表达式--“let”表达式只有在XPath 3.0中才可能。因为我想生成一个纯XPath2.0表达式,所以必须使用“for”表达式定义变量。