我使用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。我找了很久,没有成功,我找不到怎么做......
非常感谢
答案 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>