2016-10-12 9 views
1

私は以下のようなxmlとxsltファイルを持っています。そして、ゲーム名とプレイヤー名をテーブルに表示しています。しかし今、私は1つのことをやろうとしていて、私は方法を見ません。プレイヤーが異なる難易度でゲームをプレイした回数をカウントする

初心者、簡単、中、難易度、凡例、合計でプレイした回数を表示したい。たとえば、私はこのようにそれぞれの行をしたい:

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

これは*グループ化の質問です。検索を行う - おそらく最も頻繁に質問されるXSLTの質問です。 XSLT 1.0または2.0では答えが異なることに注意してください。 –

+0

質問に** ** XSLT 1.0とXSLT 2.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> 

私はすべての表のセルのコードをそれぞれ綴っていません。 els、それはどのように私は1つのレベルから綴りを願って行うことを明確にする必要があります。

私はまた、表示されたアプローチが十分であるかどうかもわかりません。ゲームごとに難易度ごとに1つのエントリしかないと仮定します。そうでなければ、difficultylevelでネストされたグループを使用する必要があります。

+0

ありがとうございます、あなたのコードは完全に動作します。しかし、このエラーが表示されている:エラー: '行144:サポートされていないXSL要素' for-each-group '' '。なぜできるのか分かりませんか? – Azz

+0

(Javaでxmlファイルを使用してhtmlファイルを作成しています) – Azz

+0

「XSLT 2.0プロセッサはfor-each-groupを使用していると仮定している」と明言しました。Javaを使用している場合は、Saxon 9 Maven上またはsaxon.sourceforge.netからのソース版(いわゆるHE Home Edition)。 –