使用xml和xslt

时间:2016-03-05 17:05:54

标签: xml xslt grouping

我有一个包含多个team元素的XML文件。每个team元素都有多个player子元素。

基本结构如下

<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:template中的xsl:template中。

我已经尝试了“select”部分的备用xpath表达式。与league/teamleagueleague/

一样

我已经尝试将xsl嵌套到另一个用于每个

的玩家和团队数据中

我安装了用于记事本++的XML Tools插件,当我尝试保存文件时,我得到: 第51行的XML解析错误: 样式表第3行中数据标记的过早结束

第51行只有结束</xsl:stylesheet>

删除for-each-group后,它会正常保存,但输出顺序不正确,正如我之前提到的那样。显示所有团队数据,然后显示所有玩家数据,而不将玩家与他们自己的表中的团队相关联。

1 个答案:

答案 0 :(得分:1)

我认为您不需要在XSLT中进行分组,因为您的播放器数据已经按照XML中的团队进行分组。您需要做的就是移动当前选择播放器的team,使其嵌套在当前选择团队的播放器中,并调整select语句,使xpath表达式相对于当前<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> 元件。

试试这个XSLT

<table>
   <thread>
      <tr>
         <th>quiz name</th>
         <th>quiz category</th>
         <th>quiz duration</th>
     </tr>
   </thread>
     <tbody>
        <?php foreach (get_all_exam() as $r) { ?>
         <tr>
             <td><?php echo $r['quiz_name'] ?></td>
             <td><?php echo $r['quiz_category_id'] ?></td> // I am getting the id value not the name
             <td><?php echo $r['quiz_duration'] ?></td>
        </tr>
        <?php } ?>
     </tbody>
</table>