使用XSLT muenchian分组计算运动队积分(赢/输)?

时间:2012-02-23 17:15:27

标签: xml xslt xslt-grouping muenchian-grouping

我一直在努力确定如何获取游戏结果的XML文件(团队和最终得分)并生成一个团队排名列表,其中显示每个团队以及他们赢得,失败或并列的次数。结果也应按总胜利排序,但我甚至无法找出计算胜负的好方法,更不用说按结果排序了。我知道它必须涉及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>

1 个答案:

答案 0 :(得分: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>