我有一个包含锦标赛数据的 XML 文件,想要计算每支球队的总得分。这是 XML:
<tournoi date="2012-12-12">
<match date="2012-12-20" heure="18:00:00">
<equipe nom="AAAA" score="3" />
<equipe nom="BBBB" score="0" />
</match>
<match date="2012-12-20" heure="20:00:00">
<equipe nom="CCCC" score="1" />
<equipe nom="DDDD" score="1" />
</match>
<match date="2012-12-21" heure="18:00:00">
<equipe nom="AAAA" score="2" />
<equipe nom="CCCC" score="4" />
</match>
<match date="2012-12-21" heure="20:00:00">
<equipe nom="BBBB" score="7" />
<equipe nom="DDDD" score="0" />
</match>
<match date="2012-12-22" heure="18:00:00">
<equipe nom="AAAA" score="3" />
<equipe nom="DDDD" score="2" />
</match>
<match date="2012-12-22" heure="20:00:00">
<equipe nom="CCCC" score="5" />
<equipe nom="BBBB" score="1" />
</match>
</tournoi>
这是我用来计算分数的 XSLT 代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="teams" match="equipe" use="@nom"/>
<xsl:template match="/">
<html>
<body>
<h2>Total points of each team</h2>
<table border="1" width="100%">
<tr bgcolor="green">
<th>Team</th>
<th>Total Points</th>
</tr>
<!-- Group by unique team names -->
<xsl:for-each select="tournoi/match/equipe[not(@nom = preceding::equipe/@nom)]">
<tr>
<td><xsl:value-of select="@nom"/></td>
<td>
<xsl:variable name="teamName" select="@nom"/>
<xsl:variable name="totalPoints" as="number">
<xsl:for-each select="key('teams', $teamName)">
<xsl:variable name="opponentScore" select="../equipe[@nom != $teamName]/@score"/>
<xsl:choose>
<xsl:when test="@score > $opponentScore"><xsl:value-of select="2" as="number"/></xsl:when>
<xsl:when test="@score = $opponentScore"><xsl:value-of select="1" as="number"/></xsl:when>
<xsl:otherwise><xsl:value-of select="0" as="number"/></xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$totalPoints"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
预期输出示例: 装备点数 AAAA 4
但目前,我获得的 AAAA 为 202,而不是 4。
您这里有两个不同的问题:
对于第一个问题,您应该使用 Muenchian 分组 方法(假设您使用的是 XSLT 1.0 处理器)。我看到您确实为此定义了一个合适的密钥,但您没有使用它。
对于第二个问题,可以使用与这里相同的方法。
结合这两种方法,生成的样式表可能如下所示:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="team" match="equipe" use="@nom"/>
<xsl:key name="wins" match="equipe[@score > ancestor::match/equipe/@score]" use="@nom"/>
<xsl:key name="draws" match="equipe[not(@score != ancestor::match/equipe/@score)]" use="@nom"/>
<xsl:template match="/tournoi">
<html>
<body>
<table border="1">
<tr>
<th>Team</th>
<th>Total Points</th>
</tr>
<xsl:for-each select="match/equipe[count(. | key('team', @nom)[1]) = 1]">
<tr>
<td>
<xsl:value-of select="@nom"/>
</td>
<td>
<xsl:value-of select="2*count(key('wins', @nom)) + count(key('draws', @nom))"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>