我有一种记分牌,想要计算胜利的球队。但不幸的是我无法计算id值的出现次数。这是示例xml文档:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="winner.xsl" ?>
<wm>
<game>
<team id='de' />
<team id='fr' />
<result>4:2</result>
</game>
<game>
<team id='us' />
<team id='de' />
<result>4:2</result>
</game>
<game>
<team id='de' />
<team id='fr' />
<result>3:2</result>
</game>
<game>
<team id='de' />
<team id='fr' />
<result>1:3</result>
</game>
</wm>
和xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="wm/game/result">
<xsl:variable name="tore1" select="substring-before(.,':')"/>
<xsl:variable name="tore2" select="substring-after(.,':')"/>
<xsl:choose>
<xsl:when test="$tore1 > $tore2">
<xsl:value-of select="../team[1]/@id"/><br />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="../team[2]/@id"/><br />
</xsl:otherwise>
</xsl:choose>
我通过比较结果的目标并选择团队[1]或团队[2]来设置游戏的赢家。输出是:
de
us
de
fr
但现在我仍然坚持计算这些国家的外观。如果我在XPath表达式上设置count(),如
<xsl:value-of select="count(../team[1]/@id)" />
导致:
1
1
1
1
另外
<xsl:value-of select="count(../team[@id = 'de'])"/>
在select语句之外的执行相同的输出。我想有以下输出
2 de
1 us
1 fr
感谢您的帮助。
答案 0 :(得分:1)
计算已知团队的获胜次数非常简单。请考虑以下示例:
<xsl:template match="/wm">
<xsl:variable name="id" select="'de'"/>
<xsl:variable name="home-wins" select="count(game[team[1]/@id=$id][substring-before(result, ':') > substring-after(result, ':')])"/>
<xsl:variable name="away-wins" select="count(game[team[2]/@id=$id][substring-after(result, ':') > substring-before(result, ':')])"/>
<xsl:value-of select="$home-wins + $away-wins"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$id"/>
</xsl:template>
<强>结果强>
2 de
答案 1 :(得分:0)
感谢。 @ michael.hor257k的答案很好。我也尝试应用Meunchian分组。我想我明白了。谢谢你的帮助。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="teamsByID" match="game/team" use="@id"/>
<xsl:template match="wm">
<xsl:for-each select="game/team[count(. | key('teamsByID', @id)[1]) = 1]">
<xsl:variable name="id" select="@id"/>
<xsl:variable name="tore1" select="count(../../game[team[1]/@id=$id][substring-before(result,':') > substring-after(result, ':')])" />
<xsl:variable name="tore2" select="count(../../game[team[2]/@id=$id][substring-after(result,':') > substring-before(result, ':')])" />
<xsl:value-of select="$tore1 + $tore2"/> - <xsl:value-of select="@id"/><br />
</xsl:for-each>
</xsl:template>