2016-03-05 64 views
1

我有一個包含多個team元素的XML文件。每個team元素都有多個player子元素。用xml和xslt分組輸出

的基本結構如下

<league> 
     <team> 
      <!-- Team details go here --> 
      <player> 
         <!-- Player details go here --> 
      </player> 
     </team> 
</league> 

我需要的是要顯示的團隊的詳細信息,然後在表中的玩家的輸出。玩家應按姓氏排序,隊名應按其姓名排序。

我得到的是一個接一個的團隊細節,然後是所有球員的細節。

我已將以下xml簡化爲只有少數幾個細節,以便於閱讀。

這是我的XML

<league xmlns:xlink="http://www.w3.org/1999/xlink"> 

    <team> 

     <teamName>Southampton</teamName> 
     <manager>Ronald Koeman</manager> 
     <stadium>St. Mary's</stadium> 

     <players> 

      <firstName>Victor</firstName> 
      <surname>Wanyama</surname> 
      <squadNumber>12</squadNumber> 

     </players> 

     <players> 

      <firstName>Shane</firstName> 
      <surname>Long</surname> 
      <squadNumber>7</squadNumber> 
     </players> 

    </team> 

     <team> 

     <teamName>Arsenal</teamName> 
     <manager>Arsene Wenger</manager> 
     <stadium>Emirates Stadium</stadium> 

     <players> 

      <firstName>Hector</firstName> 
      <surname>Bellerin</surname> 
      <squadNumber>24</squadNumber> 

     </players> 

     <players> 

      <firstName>Santi</firstName> 
      <surname>Cazorla</surname> 
      <squadNumber>19</squadNumber> 
     </players> 

    </team> 
</league> 

而XSLT

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<html> 

<head> 
    <link rel="stylesheet" type="text/css" href="epl.css" /> 
</head> 

<body> 
    <xsl:for-each select="league/team"> 
    <xsl:sort select="teamName"/> 

    <b>Name</b> 
    <p><xsl:value-of select="teamName" /></p> 

    <b>Manager</b> 
    <p><xsl:value-of select="manager" /></p> 

    <b>Stadium</b> 
    <p><xsl:value-of select="Stadium" /></p> 
    </xsl:for-each> 

    <tr> 
     <th>First Name</th> 
     <th>Surname</th> 
     <th>Squad Number</th> 
    </tr> 

    <xsl:for-each select="league/team/players"> 
    <xsl:sort select="surname"/> 
    <tr> 
    <td><xsl:value-of select="firstName"/></td> 
    <td><xsl:value-of select="surname"/></td> 
    <td><xsl:value-of select="squadNumber"/></td> 
    </tr> 
    </xsl:for-each> 

</body> 

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

我沒有足夠的代表表明了什麼我得到的圖像,但只是把我想將數據分組球隊的球員數據與下表中的每個球隊相關。

我試過了。

我試過以各種方式使用for-each-group。所有這些導致通用的「錯誤加載樣式表:解析XSLT樣式表失敗。」在Firefox中。

<xsl:for-each-group select="league" group-by="@team"> <team name="{current-grouping-key()}"> </xsl:for-each-group

這包括將for-each-group在體內的開始,在它自己的xsl:模板,在主要的xsl:模板。

我已經嘗試了「select」部分的備選xpath表達式。像league/team,,league/

我試過的嵌套在一起得到的球員和球隊數據到XSL另一個用於-每個

我有XML工具插件記事本++安裝並試圖保存文件什麼時候得到: XML解析埃羅在第51行:在樣式錶行數據標籤的 過早結束3

51號線只有收盤</xsl:stylesheet>

一旦我刪除for-each-group它正常保存但輸出順序不正確,正如我前面提到的。顯示所有球隊數據,然後顯示所有球員數據,而無需將球員與球隊聯繫起來。

回答

1

我認爲您不需要在您的XSLT中進行分組,因爲您的播放器數據已經按照您的XML分組。您只需要移動當前選擇球員的xsl:for-each,以便嵌套在當前選擇球隊的球員中,然後調整選擇語句,以便xpath表達式相對於當前的team元素。

試試這個XSLT

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

<xsl:template match="/"> 
    <html> 
    <head> 
     <link rel="stylesheet" type="text/css" href="epl.css" /> 
    </head> 
    <body> 
     <xsl:for-each select="league/team"> 
     <xsl:sort select="teamName"/> 
      <b>Name</b> 
      <p><xsl:value-of select="teamName" /></p> 
      <b>Manager</b> 
      <p><xsl:value-of select="manager" /></p> 
      <b>Stadium</b> 
      <p><xsl:value-of select="stadium" /></p> 
      <table> 
      <tr> 
       <th>First Name</th> 
       <th>Surname</th> 
       <th>Squad Number</th> 
      </tr> 
      <xsl:for-each select="players"> 
      <xsl:sort select="surname"/> 
       <tr> 
       <td><xsl:value-of select="firstName"/></td> 
       <td><xsl:value-of select="surname"/></td> 
       <td><xsl:value-of select="squadNumber"/></td> 
       </tr> 
      </xsl:for-each> 
      </table> 
      <br /> 
     </xsl:for-each> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 
+0

感謝蒂姆,我曾試圖嵌套在一起,但我錯過了,我不得不改變XPath表達式的地步。無可否認,我花了大部分時間研究並試圖爲每個小組實施。這讓我回頭看着正確的方向,代碼運行良好。再次感謝! – nod64