XSLT - 不同节点的属性值的总和

时间:2014-07-16 19:15:38

标签: xml xslt

我有这个代码XML:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Edited by XMLSpy -->
<girone>
    <classifica>
        <squadra nome="Guerrieri" punti="3"/>
        <squadra nome="Indios" punti="5"/>
                <squadra nome="Leoni" punti="4"/>
                <squadra nome="Primula Rossa" punti="1"/>
    </classifica>
    <risultati>
            <partita id="g11">
                     <squadra nome="Indios" goal="2"/>
                     <squadra nome="Guerrieri" goal="0"/>
            </partita>
            <partita id="g12">
                     <squadra nome="Primula Rossa" goal="0"/>
                     <squadra nome="Leoni" goal="3"/>
            </partita>
            <partita id="g13">
                     <squadra nome="Guerrieri" goal="2"/>
                     <squadra nome="Leoni" goal="0"/>
            </partita>
            <partita id="g14">
                     <squadra nome="Indios" goal="1"/>
                     <squadra nome="Primula Rossa" goal="1"/>
            </partita>
            <partita id="g15">
                     <squadra nome="Indios" goal="1"/>
                     <squadra nome="Leoni" goal="1"/>
            </partita>
    </risultati>
</girone>

和这段代码XSLT(一个片段):

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:for-each select="girone">
    <xsl:for-each select="risultati/partita/squadra[@nome='Indios']">
           <xsl:value-of select="sum(@goal)"/>
    </xsl:for-each>
</xsl:for-each>

我必须总结球队“Indios”得分的所有目标。但不是得到结果:4,我得到:211。这不是总和,而是顺序的目标数量(纠正)。

另外,我应该总结球队“Indios”的失球目标。我曾这么想过:

<xsl:for-each select="girone">
    <xsl:if test="risultati/partita/squadra[@nome='Indios']">
         <xsl:value-of select="sum(risultati/partita/squadra[@nome!='Indios']/@goal)"/>
    </xsl:if>     
</xsl:for-each>

1 个答案:

答案 0 :(得分:2)

此处 squadra 元素不需要 xsl:for-each 。要使sum()起作用,只需将你想要求的节点的xpath表达式放在sum()函数本身中,如下所示:

<xsl:for-each select="girone">
    <xsl:value-of select="sum(risultati/partita/squadra[@nome='Indios']/@goal)"/>
</xsl:for-each>

这应该给你答案4。

编辑:如果你想在他们玩过的游戏中让'Indios'承认这些目标,那么表达方式如下:

<xsl:value-of select="sum(risultati/partita[squadra[@nome='Indios']]/squadra[@nome!='Indios']/@goal)"/>

这给出了结果2。