2016-04-29 24 views
0

Ich habe eine XML-Datei, die Wettbewerbe, Teams und Spieler speichert, wie unten gezeigt. Ich habe zusätzliche Elemente entfernt, die für das Problem nicht relevant sind.xslt keys für verschachtelte Knoten

Grundsätzlich möchte ich eine Tabelle für jede Liga (Wettbewerb) einrichten, um Statistiken wie Tore und Vorlagen für jeden Spieler anzuzeigen. Und ich versuche Schlüssel zu verwenden, um diese miteinander zu verbinden.

Womit ich gekämpft habe, ist es, die Ergebnisse und die Ligen korrekt zu verknüpfen. Momentan druckt es die Daten, aber es zeigt die gleichen Tore und unterstützt den Spielstand unabhängig davon, welche Liga gedruckt wird.

  • Ich habe versucht, den Schlüssel umzukehren wie <xsl:key name="scoreByLeague" match="score" use="@leagueID"/>
  • folgt ich die value-of select Anweisungen für Tore/Assists in einem anderen for-each
  • Ich habe versucht, die Änderung der Kontext der for-each Knoten
gewickelt haben

Meine Vermutung wäre, dass das Problem an dieser Linie ist <xsl:value-of select="scores/score[key('leagueScore', @leagueID)]/goals"/> wie es zu sein scheint pr Eingeben der Daten, außer dass die eindeutigen Werte für jede Liga nicht angezeigt werden. Die erste Liga wird korrekt gedruckt, aber alle übrigen Ligatabellen sind nur Kopien der ersten Liga.

XML

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="football.xslt"?> 

<football> 
    <leagues> 
    <league leagueCode="EPL"> 
     <leagueName>English Premier League</leagueName> 
    </league> 
    <league leagueCode="FA"> 
     <leagueName>Football Association Cup</leagueName> 
    </league> 
    </leagues> 

    <teams> 
    <team teamCode="#ASNL"> 
     <teamName>Arsenal</teamName> 
     <stadium>Emirates Stadium</stadium> 
     <location>North London</location> 
    </team> 

    <team teamCode="#NUTD"> 
     <teamName>Newcastle United</teamName> 
     <stadium>St James' Park</stadium> 
     <location>Newcastle Upon Tyne</location> 
    </team> 
    </teams> 

    <players> 
    <player teamID="#ASNL"> 
     <playerFirstName>Hector</playerFirstName> 
     <playerSurname>Bellerin</playerSurname> 
     <position>RB</position> 
     <scores> 
     <score leagueID="EPL" > 
      <goals>2</goals> 
      <assists>5</assists> 
     </score> 
     <score leagueID="FA"> 
      <goals>1</goals> 
      <assists>3</assists> 
     </score> 
     </scores> 
    </player> 

    <player teamID="#ASNL"> 
     <playerFirstName>Mesut</playerFirstName> 
     <playerSurname>Ozil</playerSurname> 
     <position>CAM</position> 
     <scores> 
     <score leagueID="EPL" > 
      <goals>8</goals> 
      <assists>15</assists> 
     </score> 
     <score leagueID="FA"> 
      <goals>3</goals> 
      <assists>6</assists> 
     </score> 
     </scores> 

    </player> 
    <player teamID="#NUTD"> 
     <playerFirstName>Papiss</playerFirstName> 
     <playerSurname>Cisse</playerSurname> 
     <position>CF</position> 
     <scores> 
     <score leagueID="EPL" > 
      <goals>15</goals> 
      <assists>5</assists> 
     </score> 
     <score leagueID="FA"> 
      <goals>5</goals> 
      <assists>3</assists> 
     </score> 
     </scores> 
    </player> 

    <player teamID="#NUTD"> 
     <playerFirstName>Tim</playerFirstName> 
     <playerSurname>Krul</playerSurname> 
     <position>GK</position> 
     <scores> 
     <score leagueID="EPL" > 
      <goals>0</goals> 
      <assists>5</assists> 
     </score> 
     <score leagueID="FA"> 
      <goals>0</goals> 
      <assists>1</assists> 
     </score> 
     </scores> 
    </player> 
    </players> 

</football> 

XSLT

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" encoding="UTF-8"/> 

    <xsl:key name="teamPlayer" match="team" use="@teamCode"/> 
    <xsl:key name="leagueScore" match="league" use="@leagueCode"/> 

    <xsl:template match="/football"> 
    <xsl:for-each select="leagues/league"> 

     <b>Competition: </b> 
     <xsl:value-of select="leagueName"/> 
     <br /> 

     <table> 
     <tr> 
      <th>First Name</th> 
      <th>Surname</th> 
      <th>Team</th> 
      <th>Goals</th> 
      <th>Assists</th> 
     </tr> 

     <xsl:for-each select="/football/players/player"> 
      <tr> 
      <td> 
       <xsl:value-of select="playerFirstName"/> 
      </td> 
      <td> 
       <xsl:value-of select="playerSurname"/> 
      </td> 
      <td> 
       <xsl:value-of select="key('teamPlayer', @teamID)/teamName"/> 
      </td> 

      <td> 
       <xsl:value-of select="scores/score[key('leagueScore', @leagueID)]/goals"/> 
      </td> 
      <td> 
       <xsl:value-of select="scores/score[key('leagueScore', @leagueID)]/assists"/> 
      </td> 
      </tr> 
     </xsl:for-each> 
     </table> 
     <br /> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Antwort

1

Wenn ich das richtig verstehe, wollen Sie tun:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" encoding="UTF-8"/> 

<xsl:key name="score-by-league" match="score" use="@leagueID"/> 
<xsl:key name="team" match="team" use="@teamCode"/> 

<xsl:template match="/football"> 
    <xsl:for-each select="leagues/league"> 
     <b>Competition: </b> 
     <xsl:value-of select="leagueName"/> 
     <br /> 
     <table> 
      <tr> 
       <th>First Name</th> 
       <th>Surname</th> 
       <th>Team</th> 
       <th>Goals</th> 
       <th>Assists</th> 
      </tr> 
      <xsl:for-each select="key('score-by-league', @leagueCode)"> 
      <tr> 
       <td> 
        <xsl:value-of select="ancestor::player/playerFirstName"/> 
       </td> 
       <td> 
        <xsl:value-of select="ancestor::player/playerSurname"/> 
       </td> 
       <td> 
        <xsl:value-of select="key('team', ancestor::player/@teamID)/teamName"/> 
       </td> 
       <td> 
        <xsl:value-of select="goals"/> 
       </td> 
       <td> 
        <xsl:value-of select="assists"/> 
       </td> 
      </tr> 
      </xsl:for-each> 
     </table> 
     <br /> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

das folgende Ergebnis zu erhalten (gerendert):

enter image description here

+0

perfekt! Danke Michael. – nod64