2012-02-23 3 views
2

Я боролся в течение нескольких дней, чтобы определить, как взять XML-файл результатов игры (команды и итоговые оценки) и составить список команд, который показывает каждую команду, сколько раз они выигрывали, теряли или привязывали. Результаты также должны быть отсортированы по итоговым выигрышам, но я не могу даже вычислить хороший метод расчета выигрышей/потерь, не говоря уже о сортировке по результатам. Я знаю, что это должно включать в себя муэнтианскую группировку, и я закодировал ту часть, которая находит все отличные команды, но я тупик, куда идти оттуда. Любая помощь была бы высоко оценена.Использование группировки 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

Sam J., был мой ответ полезным для вас? –

ответ

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 по-прежнему очень чуждо мне по сравнению с любым другим языком, который я использовал, поэтому я ценю помощь и смог следить за тем, как работает ваш код. –

+0

@SamJ., Добро пожаловать. –