2016-10-12 1 views
1

Ich habe ein Xml und Xslt-Dateien wie unten. Und ich zeige in einer Tabelle den Spielernamen und den Spielernamen. Aber jetzt versuche ich, eine Sache zu machen, und ich sehe nicht wie.Zählen Sie die Anzahl der Male, die ein Spieler ein Spiel in einem anderen Schwierigkeitsgrad spielt

Ich möchte zeigen, wie oft ein Spieler ein Spiel in einem Anfänger, leicht, mittel, schwer, Legenden und die Summe gespielt hat. Zum Beispiel möchte ich jede Zeile wie folgt aus:

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

Ich versuche schon viele Alternativen aber ich bin mit nicht Erfolg dieses wie diese Arbeit setzen. Siehst du, wie das zu erreichen ist?

<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> 

Und das 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> 

Was ich habe, ist hier: http://xsltransform.net/pPJ8LVb/1

+1

Dies ist eine * Gruppierung * Frage. Machen Sie eine Suche - es ist wahrscheinlich die am häufigsten gestellte XSLT-Frage hier. Beachten Sie, dass die Antworten für XSLT 1.0 oder 2.0 unterschiedlich sind. –

+0

Bitte etikettieren Sie Ihre Frage nicht als ** sowohl ** XSLT 1.0 als auch XSLT 2.0. –

Antwort

1

Hier eine Adaption von dem, was Sie versucht haben, einen XSLT 2.0 Prozessor unter der Annahme, wie es for-each-group verwendet:

<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> 

Ich habe den Code für alle Tabellenzellen bzw. Lev nicht buchstabiert els, sollte es klar sein, wie man das tut, hoffe ich von der einen Ebene ausgeschrieben.

Ich bin mir auch nicht sicher, ob der gezeigte Ansatz ausreicht, es geht davon aus, dass es für jeden Spieler nur einen Eintrag pro Schwierigkeitsstufe pro Spiel gibt. Wenn nicht, müssten Sie eine verschachtelte Gruppierung von difficultylevel verwenden.

+0

Danke, Ihr Code funktioniert einwandfrei. Aber ich bekomme diesen Fehler: FEHLER: 'Zeile 144: Nicht unterstütztes XSL-Element' für jede Gruppe '.'. Weißt du, warum kann sein? – Azz

+0

(Im Erstellen einer HTML-Datei mit einer XML-Datei in Java) – Azz

+0

Ich sagte klar "Annahme eines XSLT 2.0-Prozessor, wie es für jede Gruppe verwendet" also wenn Sie Java verwenden, stellen Sie sicher, Sie verwenden Saxon 9 (verfügbar in einem offenen Source-Version (sogenannte HE Home Edition) auf Maven oder von saxon.sourceforge.net). –

Verwandte Themen