2016-04-26 20 views
0

Ich habe eine XML-Datei ähnlich der folgenden und ich möchte die richtigen Teams und Spieler zusammen mit XSLT 1.0 gruppieren. Aber anstatt die richtigen Spieler unter ihren relevanten Teams anzuzeigen, werden alle Spieler unter allen Teams angezeigt.Muenchische Gruppierungsknoten auf verschiedenen Ebenen

Ich weiß, es hat verschiedene Knoten-Sets innerhalb des Wurzelelements, was möglicherweise der Grund ist, dass die Gruppierung nicht funktioniert, ich bin nicht einmal sicher, ob dies möglich ist, scheinen die Beispiele der Munchian-Gruppierung alle einen einzigen Knotensatz zu haben innerhalb des Wurzelelements.

Die XML

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

    <football> 
        <!-- team details go here --> 
     <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> 
         <!-- end of teams --> 

        <!-- player details go here --> 
     <players> 
     <player teamID="#ASNL"> 
      <playerFirstName>Hector</playerFirstName> 
      <playerSurname>Bellerin</playerSurname> 
      <position>RB</position> 
      <goals>3</goals> 
      <assists>5</assists> 
     </player> 

     <player teamID="#ASNL"> 
      <playerFirstName>Mesut</playerFirstName> 
      <playerSurname>Ozil</playerSurname> 
      <position>CAM</position> 
      <goals>10</goals> 
      <assists>20</assists> 
     </player> 

     <player teamID="#NUTD"> 
      <playerFirstName>Papiss</playerFirstName> 
      <playerSurname>Cisse</playerSurname> 
      <position>CF</position> 
      <goals>15</goals> 
      <assists>5</assists> 
     </player> 

     <player teamID="#NUTD"> 
      <playerFirstName>Tim</playerFirstName> 
      <playerSurname>Krul</playerSurname> 
      <position>GK</position> 
      <goals>0</goals> 
      <assists>3</assists> 
     </player> 
     </players> 
          <!-- end of players --> 

    </football> 

Die XSLT

<?xml version="1.0" encoding="utf-8" ?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html"/> 
    <xsl:key name="teamKey" match="team" use="@teamCode"/> 


    <xsl:template match="/"> 

    <xsl:for-each select="/football/teams/team[generate-id(.)=generate-id(key('teamKey', @teamCode)[1])]"> 
     <xsl:sort select="teamName"/> 

     <teamDetails> 
     <br /> 
     <b>Team Name: </b> 
     <xsl:value-of select="teamName"/> 
     <br /> 
     <b>Stadium: </b> 
     <xsl:value-of select="stadium"/> 
     <br /> 
     <b>Location: </b> 
     <xsl:value-of select="location"/> 
     <br /> 
     </teamDetails> 

     <table> 
     <br /> 
     <tr> 
      <th>First Name</th> 
      <th>Surname</th> 
      <th>Position</th> 
      <th>Goals</th> 
      <th>Assists</th> 
     </tr> 

     <xsl:for-each select="/football/players/player[key('teamKey', @teamID)]"> 
      <tr> 
      <td> 
       <xsl:value-of select="playerFirstName"/> 
      </td> 
      <td> 
       <xsl:value-of select="playerSurname"/> 
      </td> 
      <td> 
       <xsl:value-of select="position"/> 
      </td> 
      <td> 
       <xsl:value-of select="goals"/> 
      </td> 
      <td> 
       <xsl:value-of select="assists"/> 
      </td> 
      </tr> 
     </xsl:for-each> 
     </table> 
    </xsl:for-each> 

    </xsl:template> 
</xsl:stylesheet> 

Antwort

1

Ich würde vorschlagen, Sie es auf diese Weise 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="player-by-team" match="player" use="@teamID"/> 

<xsl:template match="/football"> 
    <xsl:for-each select="teams/team"> 
     <xsl:sort select="teamName"/> 
     <b>Team Name: </b> 
     <xsl:value-of select="teamName"/> 
     <br /> 
     <b>Stadium: </b> 
     <xsl:value-of select="stadium"/> 
     <br /> 
     <b>Location: </b> 
     <xsl:value-of select="location"/> 
     <br /> 
     <table> 
      <tr> 
       <th>First Name</th> 
       <th>Surname</th> 
       <th>Position</th> 
       <th>Goals</th> 
       <th>Assists</th> 
      </tr> 
      <xsl:for-each select="key('player-by-team', @teamCode)"> 
       <tr> 
        <td> 
         <xsl:value-of select="playerFirstName"/> 
        </td> 
        <td> 
         <xsl:value-of select="playerSurname"/> 
        </td> 
        <td> 
         <xsl:value-of select="position"/> 
        </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> 
1

keine Notwendigkeit für eine Muench ihre Gruppierung:

Ändern Sie die erste Schleife für die Teams (und haben eine Variable für den aktuellen Team):

<xsl:for-each select="/football/teams/team"> 
    <xsl:sort select="teamName"/> 
    <xsl:variable name="thisTeam" select="." /> 

Und als die zweite Schleife für die Spieler innerhalb des Teams:

<xsl:for-each 
     select="/football/players/player[ @teamID = $thisTeam/@teamCode ]"> 
+0

Dies funktioniert gut, aber ich die relationale Schlüssel Methode bevorzugt. Vielen Dank – nod64

Verwandte Themen