计算玩家在不同难度级别下玩游戏的次数

时间:2016-10-12 22:53:30

标签: xml xslt xpath xslt-2.0

我有一个xml和xslt文件,如下所示。我在表格中显示了游戏名称和玩家名称。但是现在我想做一件事,我不知道怎么做。

我想展示玩家在新手,简单,中等,艰难,传奇级别以及总数中玩过多少次游戏。例如,我想要像这样的每一行:

GameName | Player Name | NoviceLevels | EasyLevels | MediumLevels | HardLevels | Total

我已经尝试了很多替代方案,但我没有成功,这就像这样工作。你知道如何实现这个目标吗?

<games>
  <game>
    <gamename>GameTitle 1</gamename>
    <players>
      <player>
          <playername>John</playername>
          <difficultlevel>Novice</difficultlevel>
          <duration>130</duration>
      </player>
      <player>
        <playername>John</playername>
        <difficultlevel>Easy</difficultlevel>
        <duration>210</duration>
      </player>
      <player>
        <playername>Zed</playername>
        <difficultlevel>Medium</difficultlevel>
        <duration>300</duration>
      </player>
    </players>
  </game>
</games>

这个xslt:

<table>
<xsl:for-each select="//games">
 <tr>
   <th>GameName</th>
   <th>Player</th>
   <th>Beginner</th>
   <th>Beginner</th>
   <th>Medium</th>
   <th>Hard</th>
   <th>Legend</th>
   <th>Total</th>
 </tr>
<xsl:for-each select="game">
 <tr>
   <td><xsl:value-of select="gamename"/></td>
   <td><xsl:value-of select="players/player/playername"/></td>
   ....???
 </tr>
 </xsl:for-each>
</table>

我所拥有的是:http://xsltransform.net/pPJ8LVb/1

1 个答案:

答案 0 :(得分:1)

这是对您尝试的内容的一种改编,假设使用for-each-group的XSLT 2.0处理器:

<html xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="2.0">
<table>

        <tr>
            <th>GameName</th>
            <th>Player</th>
            <th>NoviceLevels</th>
            <th>EasyLevels</th>
            <th>Medium</th>
            <th>Hard</th>
            <th>Legend</th>
            <th>Total</th>
        </tr>
        <xsl:for-each select="games/game">
          <xsl:for-each-group select="players/player" group-by="playername">
            <tr>
                <td><xsl:value-of select="ancestor::game/gamename"/></td>
                <td><xsl:value-of select="playername"/></td>
                <td><xsl:value-of select="current-group()[difficultlevel = 'Novice']/duration"/></td>
                <td>...</td>
                <td>...</td>
                <td>...</td>
                <td>...</td>
                <td><xsl:value-of select="sum(current-group()/duration)"/></td>
            </tr>
          </xsl:for-each-group>
        </xsl:for-each>


    </table>
</html>

我没有详细说明所有表格单元格的代码级别,应该清楚如何做到这一点我希望从一个单元格的拼写出来。

我也不确定所显示的方法是否足够,它假设任何玩家每个游戏的每个难度级别只有一个条目,如果没有,你需要使用difficultylevel的嵌套分组。 / p>