试图理解xsl:key

时间:2017-04-16 19:07:15

标签: xml xslt xpath

我是xslt的新手,我正在尝试学习xslt 1.0。

我试图找出如何使用我的xml文件获取以下结果。我用我的xsl文件玩了很多但是我认为有些东西我没有得到,因为它根本不起作用......

因为我是初学者,请保持简单回答。谢谢!

结果应如下所示:

Code      Number of students    Average per course
INF4830     3                   86.0
INF1130     3                   77.7
INF1330     4                   82.0
INF4930     1                   40.0

这是我的xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet href="temptransfo.xsl" type="text/xsl" ?>
<university>
<student><name>Robert Shaw</name>
<course code="INF4830" note="90" />
<course code="INF1130" note="70" />
<course code="INF1330" note="76" /></student>
<student><name>Peter Manning</name>
<course code="INF4830" note="76" />
<course code="INF1130" note="73" />
<course code="INF1330" note="74" /></student>
<student><name>Jeff Cooper</name>
<course code="INF4930" note="40" />
<course code="INF1130" note="90" />
<course code="INF1330" note="80" /></student>
<student><name>Laureen Hanley</name>
<course code="INF4830" note="92" />
<course code="INF1330" note="98" /></student>
</university> 

到目前为止,这是我的xsl文件,但它不起作用。结果中没有显示结果......

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output 
    method="html"
    encoding="UTF-8"
    doctype-public="-//W3C//DTD HTML 4.01//EN"
    doctype-system="http://www.w3.org/TR/html4/strict.dtd"
    indent="yes" ></xsl:output>

<xsl:key name="mytable" match="student", use="course" />  
<xsl:template match="/">
<html>
<head>
<title>Test1</title>
</head>
<body>
<table border="1">
<caption>Test1</caption>
<tr>
<th>Code</th>
<th>Number of student</th>
<th>Course average</th>
</tr>
<xsl:for-each select = "//course" >
<xsl:if test="generate-id(.)=generate-id(key('mytable',course[@code])[1])">
<tr>
<td> <xsl:value-of select="@code"/> </td>
<td> <xsl:value-of select="count(//course[@code=current()/@code])"/> </td>
<td> <xsl:value-of select="(sum (//course/@note)) div (count(//course[@code]))"/> </td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

首先,您想获得一系列不同的课程;为此,你需要把钥匙交给你:

<xsl:key name="course-by-code" match="course" use="@code" /> 

接下来,您要重新使用密钥以获取每个课程中所有注册的列表 - 例如:

<xsl:for-each select="/university/student/course[generate-id(.)=generate-id(key('course-by-code', @code)[1])]" >
    <xsl:variable name="enrollments" select="key('course-by-code', @code)"/>
    <tr>
        <td>
            <xsl:value-of select="@code"/>
        </td>
        <td>
            <xsl:value-of select="count($enrollments)"/>
        </td>
        <td>
            <xsl:value-of select="sum($enrollments/@note) div count($enrollments)"/>
        </td>
    </tr>
</xsl:for-each>