我有一个包含多个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/team
,league
,league/
我已经尝试将xsl嵌套到另一个用于每个
的玩家和团队数据中我安装了用于记事本++的XML Tools插件,当我尝试保存文件时,我得到: 第51行的XML解析错误: 样式表第3行中数据标记的过早结束
第51行只有结束</xsl:stylesheet>
删除for-each-group
后,它会正常保存,但输出顺序不正确,正如我之前提到的那样。显示所有团队数据,然后显示所有玩家数据,而不将玩家与他们自己的表中的团队相关联。
答案 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>