2012-04-16 53 views
2

是否可以指定一個XPath查詢,使得它可以指望在一組兒童的文本值的數字:指定XPath來計算一組子節點的值?

這最好用一個例子來說明,比如:

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

因此,是否可以指定一個Xpath,以獲得total_badges = 49。 (從:2 + 15 + 32)

回答

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

感謝您的迴應。但我只是想在這裏測試http://www.xpathtester.com/test,但似乎返回一個錯誤。任何想法爲什麼? – Larry 2012-04-16 13:19:01

+1

@Larry:您可以下載並使用更好的工具 - XPath Visualizer - :http://www.huttar.net/dimitre/XPV/TopXML-XPV.html – 2012-04-16 13:24:10

+0

@Larry:我更新了答案任何人都可以運行並驗證提供的XPath表達式產生所需結果的基於XSLT的驗證。 – 2012-04-16 13:29:25

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