我使用 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。我找了很久,没有成功,我不知道该怎么做......
非常感谢
最佳答案
使用:
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>
关于filter - XQuery - 仅检索部分信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10252715/