我有一个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>
答案 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>