2017-04-16 8 views
0

私はxsltが新しく、xslt 1.0を学びたいと思っています。xsl:keyを理解しようとしています

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> 
+0

を私の答えで指摘した概念上の誤りから、構文エラーもあります。属性の間にコンマを置くことはできません(XSLTの10行目)。 –

答えて

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> 
+0

ありがとうございました。 xsl:keyの使い方をもっとよく理解できました。私の頭の中ではそれよりもはるかに複雑でしたが、あなたの説明は理解しやすくなりました。どうもありがとう ! :-)私はxsltに新しいですし、私は簡単に混乱するので、理解するのは必ずしも容易ではありません。 – Zyplexx

関連する問題