<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="books.xsl"?>
<bookList>
<Book BookId="3311">
<BookName>Flying</BookName>
<readerList>
<readers sid="1001">Ashley</readers>
<readers sid="1002">Mark</readers>
<readers sid="1003">Donar</readers>
</readerList>
<readingItems>
<readings name="Assign 4" weight="20">
<mark studId="1001">15</mark>
<mark studId="1002">18</mark>
<mark studId="1003">9</mark>
</readings>
<readings name="Assign 5" weight="25">
<mark studId="1001">23</mark>
<mark studId="1002">14</mark>
<mark studId="1003">23</mark>
</readings>
<readings name="Essay" weight="15">
<mark studId="1001">13</mark>
<mark studId="1002">12</mark>
<mark studId="1003">6</mark>
</readings>
<readings name="Exam" weight="40">
<mark studId="1001">38</mark>
<mark studId="1002">25</mark>
<mark studId="1003">20.5</mark>
</readings>
</readingItems>
</Book>
</bookList>
这是书籍的数据。我无法改变格式。我不知道如何与读者合作阅读。无论我做什么,它似乎都无法发挥作用。
这是我的xsl表
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>ID</th>
<th>Name</th>
<th>Total Mark</th>
<th>Grade</th>
</tr>
<xsl:apply-templates select="bookList/Book/readerList"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="readerList">
<tr>
<td><xsl:value-of select="readers/@sid"/></td>
<td><xsl:value-of select="readers"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
我希望它显然符合我指定的格式,但无论我做什么,我都无法让它工作。
答案 0 :(得分:1)
您遇到的一个问题是您的XML已readerList
,但您的XSLT已readersList
。此外,您只有一个readerList
但看起来您希望模板中的代码与每个reader
输出一次,因此您可能希望选择reader
元素。< / p>
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>ID</th>
<th>Name</th>
<th>Total Mark</th>
<th>Grade</th>
</tr>
<xsl:apply-templates select="bookList/Book/readerList/readers"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="readers">
<tr>
<td><xsl:value-of select="@sid"/></td>
<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="sum(../../readingItems/readings/mark[@studId = current()/@sid])"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
注意我还展示了如何获得总分,尽管使用xsl:key
可以改善这一点。
这假设您的XML中有多本书,并且您希望按书分隔结果:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="marksByBook" match="mark" use="concat(../../../@BookId, '|', @studId)" />
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>ID</th>
<th>Name</th>
<th>Total Mark</th>
<th>Grade</th>
</tr>
<xsl:apply-templates select="bookList/Book/readerList/readers"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="readers">
<tr>
<td><xsl:value-of select="@sid"/></td>
<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="sum(key('marksByBook', concat(../../@BookId, '|', @sid)))"/></td>
<td>?</td>
</tr>
</xsl:template>
</xsl:stylesheet>
考虑到weight
可能会更麻烦,并且可能需要一个新问题......