【问题标题】:xslt keys for nested nodes嵌套节点的 xslt 键
【发布时间】:2016-04-29 15:19:09
【问题描述】:

我有一个存储比赛、球队和球员的 xml 文件,如下所示。我已经删除了与问题无关的其他元素。

基本上,我想为每个联赛(比赛)设置一个表格,以显示与每个球员相关的进球和助攻等统计数据。我正在尝试使用键将它们链接在一起。

我一直在努力解决的是将分数和联赛正确关联起来。目前它会打印数据,但无论打印哪个联赛,它都会显示相同的进球和助攻得分。

  • 我尝试过如下反转密钥 <xsl:key name="scoreByLeague" match="score" use="@leagueID"/>
  • 我已将目标/助攻的 value-of select 声明包装在另一个 for-each
  • 我已尝试更改 for-each 节点的上下文

我的猜测是问题出在这一行 <xsl:value-of select="scores/score[key('leagueScore', @leagueID)]/goals"/> 因为它似乎正在打印数据,但它没有显示每个联赛的唯一值。即第一个联赛打印正确,但所有剩余的联赛表只是第一个的副本。

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>

【问题讨论】:

    标签: xml xslt


    【解决方案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="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>
    

    接收以下结果(渲染):

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      相关资源
      最近更新 更多