2016-04-26 12 views
0

私は以下のようなxmlファイルを持っており、XSLT 1.0を使って正しいチームと選手をグループ化したい。しかし、関連するチームの下に正しいプレイヤーを表示する代わりに、すべてのチームの下にすべてのプレーヤーを表示します。異なるレベルのmuenchianグループ化ノード

ルート要素内に異なるノードセットがあり、グループ化が機能しない可能性があることはわかっていますが、これが可能かどうかはわかりませんが、muenchianグループの例はすべて単一のノードセットルート要素の内部。

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> 

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> 

答えて

1

私はあなたがこのようにそれを行うことをお勧めしたい:

<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

彼女をグループ化する任意のmuenchianは必要ない:

変更(にチームの最初のループと電流のための変数を持っていますチーム):

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

とのチーム内の選手のための第二のループより:

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

これは正常に動作しますが、私は、リレーショナルキー方式を好みました。ありがとう – nod64

関連する問題