指定XPath来计算一组子节点的值?

时间:2012-04-16 12:24:58

标签: xml xpath

是否可以指定XPath查询,以便它可以计算一组子项的文本值处的数字:

最好用一个例子来解释,例如:

    <badge_counts>
        <gold>2</gold>
        <silver>15</silver>
        <bronze>32</bronze>
    </badge_counts>

因此,是否可以指定Xpath来获取total_badges = 49。 (来自:2 + 15 + 32)

2 个答案:

答案 0 :(得分:2)

使用

sum(/*/*)

这将生成XML文档中作为文档顶部元素的子元素的所有元素的字符串值转换为数字的总和。

作为一项规则:尽可能避免使用//伪运算符,因为这可能导致意外的低效评估 - 在这种情况下,许多XPath引擎执行完全遍历整个树根植于上下文节点。

基于XSLT的验证

此转化

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:value-of select="sum(/*/*)"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<badge_counts>
    <gold>2</gold>
    <silver>15</silver>
    <bronze>32</bronze>
</badge_counts>

评估XPath表达式并输出结果

49

答案 1 :(得分:0)

怎么样:

sum(//badge_counts/*/text())

Python示例:

>>> from lxml import etree
>>> doc = etree.XML("""<badge_counts><gold>2</gold><silver>15</silver><bronze>32</bronze></badge_counts>""")
>>> doc.xpath('//badge_counts/*/text()')
['2', '15', '32']
>>> doc.xpath('sum(//badge_counts/*/text())')
49.0