File: Data.xml <?xml version="1.0"?> <results group="A"> <match> <date>10-Jun-98</date> <team score="2">team 1</team> <team score="1">team 2</team> </match> <match> <date>10-Jun-98</date> <team score="2">team 3</team> <team score="2">team 4</team> </match> <match> <date>16-Jun-98</date> <team score="1">team 2</team> <team score="1">team 4</team> </match> </results> File: Transform.xslt <?xml version="1.0"?> <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:variable name="teams" select="distinct-values(//team)" /> <xsl:variable name="matches" select="//match" /> <xsl:template match="results"> <league> <xsl:for-each select="$teams"> <xsl:variable name="this" select="." /> <xsl:variable name="played" select="count($matches[team=$this])" /> <xsl:variable name="won" select="count($matches[team[.=$this]/@score > team[.!=$this]/@score])" /> <xsl:variable name="lost" select="count($matches[team[.=$this]/@score < team[.!=$this]/@score])" /> <xsl:variable name="drawn" select="count($matches[team[.=$this]/@score = team[.!=$this]/@score])" /> <xsl:variable name="for" select="sum($matches/team[.=current()]/@score)" /> <xsl:variable name="against" select="sum($matches[team=current()]/team/@score) - $for" /> <team name="{.}" played="{$played}" won="{$won}" drawn="{$drawn}" lost="{$lost}" for="{$for}" against="{$against}" /> </xsl:for-each> </league> </xsl:template> </xsl:transform> Output: <?xml version="1.0" encoding="UTF-8"?><league> <team name="team 1" played="1" won="1" drawn="0" lost="0" for="2" against="1"/><team name="team 2" played="2" won="0" drawn="1" lost="1" for="2" against="3"/> <team name="team 3" played="1" won="0" drawn="1" lost="0" for="2" against="2"/><team name="team 4" played="2" won="0" drawn="2" lost="0" for="3" against="3"/></league>