2012-02-23 50 views
2

我一直在努力尋找如何獲取遊戲結果(團隊和最終分數)的XML文件,並生成一個團隊排名列表,顯示每個團隊以及他們贏得,輸掉或綁定的次數。結果也應該按總勝分排序,但我甚至無法找出計算勝負的一個好方法,更不用說按結果排序了。我知道它必須涉及muenchian分組,並且我已經編寫了可以找到所有不同團隊的部分,但卻難以從那裏發展。任何幫助將不勝感激。使用XSLT muenchian分組來計算運動隊積分(贏/輸)?

games.xml

<?xml version="1.0" encoding="UTF-8"?> 

<?xml-stylesheet type="text/xsl" href="games.xsl"?> 

<Games> 

    <Game> 
    <Home>Team A</Home> 
    <Away>Team B</Away> 
    <Home_Score>20</Home_Score> 
    <Away_Score>15</Away_Score> 
    </Game> 

    <Game> 
    <Home>Team C</Home> 
    <Away>Team D</Away> 
    <Home_Score>12</Home_Score> 
    <Away_Score>18</Away_Score> 
    </Game> 

    <Game> 
    <Home>Team A</Home> 
    <Away>Team C</Away> 
    <Home_Score>8</Home_Score> 
    <Away_Score>8</Away_Score> 
    </Game> 

    <Game> 
    <Home>Team B</Home> 
    <Away>Team D</Away> 
    <Home_Score>6</Home_Score> 
    <Away_Score>14</Away_Score> 
    </Game> 

    <Game> 
    <Home>Team D</Home> 
    <Away>Team C</Away> 
    <Home_Score>9</Home_Score> 
    <Away_Score>11</Away_Score> 
    </Game> 

    <Game> 
    <Home>Team C</Home> 
    <Away>Team A</Away> 
    <Home_Score>13</Home_Score> 
    <Away_Score>13</Away_Score> 
    </Game> 

</Games> 

games.xsl

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

    <!-- Key for identifying teams --> 
    <xsl:key name="unique-teams" match="/Games/Game" use="Home" /> 

    <xsl:template match="/"> 
    <html> 
    <head> 
    <title>Team Standings</title> 
    </head> 
    <body> 

     <!-- Get distinct teams, sort by team name --> 
     <xsl:apply-templates select="//Game[generate-id() = generate-id(key('unique-teams', Home)[1])]"> 
      <xsl:sort select="Home" /> 
     </xsl:apply-templates> 

    </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="Game"> 

    <!-- Current team --> 
    <xsl:variable name="selectedteam" select="Home" /> 

    <!-- Output each unique team name to the screen --> 
    <h1><xsl:value-of select="$selectedteam"/></h1> 

    <!-- Loop through all games to calculate totals??? --> 
    <xsl:for-each select="//Game">  
    </xsl:for-each> 

    </xsl:template> 

</xsl:stylesheet> 
+0

山姆J.,是我的回答對你有用? – 2012-02-23 21:05:05

回答

2

你想是這樣的(XSLT 1.0):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:key name="kTeamByName" match="Home|Away" use="."/> 

<xsl:template match="/*"> 

<table border="1"> 
    <tr> 
    <td>Team</td><td>W</td><td>D</td><td>L</td> 
    </tr> 
     <xsl:apply-templates select= 
     "(*/Home | */Away) 
     [generate-id() 
     = 
     generate-id(key('kTeamByName', .)[1]) 
     ] 
     "> 
     <xsl:sort data-type="number" order="descending" select= 
     "count(key('kTeamByName', .) 
       [self::Home 
       and 
        ../Home_Score > ../Away_Score 
       or 
        self::Away 
       and 
        ../Away_Score > ../Home_Score 
       ] 
      ) 
     "/> 

     </xsl:apply-templates> 
    </table> 
</xsl:template> 

<xsl:template match="Home|Away"> 
    <tr> 
    <td> 
    <xsl:value-of select="."/> 
    </td> 
    <td> 
    <xsl:value-of select= 
    "count(key('kTeamByName', .) 
       [self::Home 
       and 
        ../Home_Score > ../Away_Score 
       or 
        self::Away 
       and 
        ../Away_Score > ../Home_Score 
       ] 
      )"/> 
    </td> 
    <td> 
    <xsl:value-of select= 
    "count(key('kTeamByName', .) 
       [../Home_Score = ../Away_Score] 
      )"/> 
    </td> 
    <td> 
    <xsl:value-of select= 
    "count(key('kTeamByName', .) 
       [self::Home 
       and 
        ../Away_Score > ../Home_Score 
       or 
        self::Away 
       and 
        ../Home_Score > ../Away_Score 
       ] 
      )"/> 
    </td> 
    </tr> 
</xsl:template> 

<xsl:template match="text()"/> 
</xsl:stylesheet> 

當這種轉化應用所提供的XML文檔

<Games> 
    <Game> 
     <Home>Team A</Home> 
     <Away>Team B</Away> 
     <Home_Score>20</Home_Score> 
     <Away_Score>15</Away_Score> 
    </Game> 
    <Game> 
     <Home>Team C</Home> 
     <Away>Team D</Away> 
     <Home_Score>12</Home_Score> 
     <Away_Score>18</Away_Score> 
    </Game> 
    <Game> 
     <Home>Team A</Home> 
     <Away>Team C</Away> 
     <Home_Score>8</Home_Score> 
     <Away_Score>8</Away_Score> 
    </Game> 
    <Game> 
     <Home>Team B</Home> 
     <Away>Team D</Away> 
     <Home_Score>6</Home_Score> 
     <Away_Score>14</Away_Score> 
    </Game> 
    <Game> 
     <Home>Team D</Home> 
     <Away>Team C</Away> 
     <Home_Score>9</Home_Score> 
     <Away_Score>11</Away_Score> 
    </Game> 
    <Game> 
     <Home>Team C</Home> 
     <Away>Team A</Away> 
     <Home_Score>13</Home_Score> 
     <Away_Score>13</Away_Score> 
    </Game> 
</Games> 

想要的,正確的結果產生

<table border="1"> 
    <tr> 
     <td>Team</td> 
     <td>W</td> 
     <td>D</td> 
     <td>L</td> 
    </tr> 
    <tr> 
     <td>Team D</td> 
     <td>2</td> 
     <td>0</td> 
     <td>1</td> 
    </tr> 
    <tr> 
     <td>Team A</td> 
     <td>1</td> 
     <td>2</td> 
     <td>0</td> 
    </tr> 
    <tr> 
     <td>Team C</td> 
     <td>1</td> 
     <td>2</td> 
     <td>1</td> 
    </tr> 
    <tr> 
     <td>Team B</td> 
     <td>0</td> 
     <td>0</td> 
     <td>2</td> 
    </tr> 
</table> 
+0

太好了,非常感謝你的完整示例。與我使用的其他語言相比,XSL對我來說仍然非常陌生,所以我非常感謝幫助,並能夠了解代碼的工作原理。 – 2012-02-24 04:05:20

+0

@SamJ。,不客氣。 – 2012-02-24 04:17:03