xml - 使用 XSLT muenchian 分组来计算运动队排名(胜/负)?

标签 xml xslt xslt-grouping muenchian-grouping

我几天来一直在努力确定如何获取游戏结果(球队和最终得分)的 XML 文件并生成一个球队排名列表,该列表显示每个球队以及他们获胜、失败或平局的次数。结果也应该按总胜利排序,但我什至无法找出计算胜/负的好方法,更不用说按结果排序了。我知道它必须涉及慕尼黑分组,并且我已经编写了找到所有不同团队的部分代码,但我不知道从哪里开始。任何帮助将不胜感激。

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>

最佳答案

您想要这样的东西(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>

关于xml - 使用 XSLT muenchian 分组来计算运动队排名(胜/负)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9417811/

相关文章:

xslt - 如何在XSLt 2.0中为每个循环丢弃重复结构。

xml - 如何使用PowerShell编辑和保存XML节点

java - 在 android 中膨胀对话框 fragment 时出现未知类异常

python - 在没有外部库的情况下合并具有嵌套元素的 xml 文件

xml - XSL Sort 将小写字母与大写字母分开处理

html - 使用 XSLT 选择包含 HTML 标签的 n 个词的摘要

xml - 使用 XSL 将所有元素名称转换为小写?

Java 输入流/XSL 线程安全

xml - 仅为 XSL 1.0 中的特定条件列出组内属性的唯一值