xpath与节点中tag的值匹配的所有previous-siblings的总和

时间:2014-12-08 13:58:25

标签: xml xpath

我遇到了以下问题:

使用xpath表达式我必须对匹配标记值的所有前面的兄弟节点求和。 实际上我在最后一个节点元素上有一定的id。

相对于这个位置,我必须输出所有前面兄弟的总和,它们与./id

中的相同id相匹配

出于架构原因,我仅限于xpath 2.0,必须使用xpath表达式找到解决方案。

样本结构

<root>
...
<element>
    <id>198</id>
    <sum>1</sum>
</element>
<element>
    <id>198</id>
    <sum>0</sum>
</element>
<element>
    <id>267</id>
    <sum>2</sum>
</element>
<element>
    <id>267</id>
    <sum>0</sum>
</element>
<element>
    <id>267</id>
    <sum>0</sum>
</element>
<element>
    <id>267</id>
    <sum>0</sum>
</element>
<element>
    <id>3123</id>
    <sum>34</sum>
</element>
<element>
    <id>3123</id>
    <sum>0</sum>
</element>
<element>
    <id>3123</id>
    <sum>0</sum>
</element>
...
</root>

我试过了:

sum(preceding-sibling::element[./id = self::*/id]/sum)

表达式的结果与预期值不匹配: 该表达式总结了位于起始元素之前的所有标记的值,而不仅仅是特定标记的值。

我想得到以下结果:

最后一个id为198的元素,结果应为1

最后一个id为267的元素,结果应为2

最后一个id为3123的元素,结果应为34

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

使用XPath 2.0,您需要使用设置变量并使用变量解析器(如何执行此操作取决于XPath API)并执行以下操作: sum(preceding-sibling::element[id = $el/id]/sum)。使用XPath 3.0,您可以let $el := . return sum($el/preceding-sibling::element[id = $el/id]/sum)