2012-05-10 6 views
0

なぜ私の変数の割り当てられた合計が機能していないか、テーブル全体の出力がテーブル全体を通して最初の要素だけ繰り返されているかを調べようとしています。私がこのコードを取得しようとしているのは、第1列に印刷された各生徒のstudentID、そのIDの生徒名を第2列に入れて、3つの評価の生徒総数を保持する変数を割り当てます3番目の列に合計マークを印刷し、続いてそれらの総マークに基づいてHD、D、C、P、またはFを割り当てるHDは85プラス、Dは75+ですが84を超えません。XSL sum()と変数/ループ

どこが間違っているか教えていただけますか?私はまだXML/XSLに慣れていないので、批評は大歓迎です。

grade.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="/"> 

    <xsl:variable name="StudentAmount" select="count(document('AssessmentItems.xml')/assessmentList/unit/studentList/student)"/> 
    <xsl:variable name="totalmark" select="sum(document('AssessmentItems.xml')/assessmentList/unit/* 
    [//assessmentList/unit/assessmentItems/assessment/@studId = //assessmentList/unit/studentList/student/@sid])"/> 

    <html> 
    <body> 
    <h2>Grade Report for <xsl:value-of select="assessmentList/unit/@unitId"/> - <xsl:value-of select="assessmentList/unit/unitName"/></h2> 
    <p>Number of students in this unit: <xsl:value-of select="$StudentAmount"/></p> 

    <table border="1"> 
     <tr> 
     <th>ID</th> 
     <th>Name</th> 
     <th>Total Mark</th> 
     <th>Grade</th> 
     </tr> 
     <xsl:for-each select="assessmentList/unit/studentList/student"> 
     <tr> 
     <td><xsl:value-of select="document('AssessmentItems.xml')/assessmentList/unit/studentList/student/@sid"/></td> 
     <td><xsl:value-of select="document('AssessmentItems.xml')/assessmentList/unit/studentList/student"/></td> 
     <td><xsl:value-of select="document('AssessmentItems.xml')/assessmentList/unit/assessmentItems/assessment/mark"/></td> 

     <xsl:choose> 
     <xsl:when test="$totalmark &gt; 85"> 
     <td color="blue">HD</td> 
     </xsl:when> 

     <xsl:when test="$totalmark &gt; 75"> 
     <td color="black">D</td> 
     </xsl:when> 

     <xsl:when test="$totalmark &gt; 65"> 
     <td color="black">C</td> 
     </xsl:when> 

     <xsl:when test="$totalmark &gt; 50"> 
     <td color="black">P</td> 
     </xsl:when> 

     <xsl:otherwise> 
     <td color="red">F</td> 
     </xsl:otherwise> 
     </xsl:choose> 

     </tr> 
     </xsl:for-each> 
    </table> 

    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

、これはあなたが唯一の単一のXML文書で作業しているので、あなたは一定の参照を必要としない、まずファイルAssessmentItems.xml

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="grade.xsl"?> 
<assessmentList> 
    <unit unitId="3311"> 
     <unitName>Learn To Read</unitName> 
     <studentList> 
      <student sid="1001">Lisa Simpson</student> 
      <student sid="1002">Barney Rubble</student> 
      <student sid="1003">Donald Duck</student> 
     </studentList> 
     <assessmentItems> 
      <assessment name="Assignment 1" weight="20"> 
       <mark studId="1001">12</mark> 
       <mark studId="1002">18</mark> 
       <mark studId="1003">9</mark> 
      </assessment> 
      <assessment name="Assignment 2" weight="25"> 
       <mark studId="1001">23</mark> 
       <mark studId="1002">14</mark> 
       <mark studId="1003">12.5</mark> 
      </assessment> 
      <assessment name="Quiz" weight="15"> 
       <mark studId="1001">13</mark> 
       <mark studId="1002">9</mark> 
       <mark studId="1003">6</mark> 
      </assessment> 
      <assessment name="Final Exam" weight="40"> 
       <mark studId="1001">38</mark> 
       <mark studId="1002">21</mark> 
       <mark studId="1003">20.5</mark> 
      </assessment> 
     </assessmentItems> 
    </unit> 
</assessmentList> 

答えて

0

です文書化する( 'AssessmentItems.xml')。したがって、たとえば

<xsl:value-of 
    select="document('AssessmentItems.xml')/assessmentList/unit/studentList/student/@sid"/> 

これは第二の問題へとつながるだけ

<xsl:value-of select="/assessmentList/unit/studentList/student/@sid"/> 

に置き換えることができます。上のxpathはXMLのドキュメント要素との相対的なもので、最初に見つかった生徒の@sidと、現在配置されている生徒の@sidは返されません。あなたは、単に

<xsl:value-of select="@sid"/> 

もう一つの問題は、実際にはそれはあなたのXSLの範囲内で定義されなければならないときに、XSLTの上部にある変数totalmarksを定義することで、あなたのケースでこれを行うことができます:FOR-それは

<xsl:variable name="totalmark" select="sum(../../assessmentItems/assessment/mark[@studId = current()/@sid])" /> 

実際に、現在の学生に特異的であるように、各は、結果ルックアップするために、ここでキーを利用する方が良いかもしれ

<xsl:key name="marks" match="mark" use="@studId" /> 

そしてない問題は、XSL利用するほうが良いことが多いものの、....

<xsl:variable name="totalmark" select="sum(key('marks', @sid))" /> 

一つの最終コメントを学生のためのトータルな結果を得るために:適用-テンプレートではなく、XSLを: for-eachこれは、過度の字下げを回避し、より良いコード再利用を可能にするためです。

は、次のXSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="marks" match="mark" use="@studId"/> 

    <xsl:template match="/"> 
     <xsl:variable name="StudentAmount" select="count(/assessmentList/unit/studentList/student)"/> 
     <html> 
     <body> 
      <h2>Grade Report for 
       <xsl:value-of select="assessmentList/unit/@unitId"/>- 
       <xsl:value-of select="assessmentList/unit/unitName"/> 
      </h2> 
      <p>Number of students in this unit: 
       <xsl:value-of select="$StudentAmount"/></p> 
      <table border="1"> 
       <tr> 
        <th>ID</th> 
        <th>Name</th> 
        <th>Total Mark</th> 
        <th>Grade</th> 
       </tr> 
       <xsl:apply-templates select="assessmentList/unit/studentList/student"/> 
      </table> 
     </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="student"> 
     <xsl:variable name="totalmark" select="sum(key('marks', @sid))"/> 
     <tr> 
     <td> 
      <xsl:value-of select="@sid"/> 
     </td> 
     <td> 
      <xsl:value-of select="."/> 
     </td> 
     <td> 
      <xsl:value-of select="$totalmark"/> 
     </td> 
     <xsl:choose> 
      <xsl:when test="$totalmark &gt; 85"> 
       <td color="blue">HD</td> 
      </xsl:when> 
      <xsl:when test="$totalmark &gt; 75"> 
       <td color="black">D</td> 
      </xsl:when> 
      <xsl:when test="$totalmark &gt; 65"> 
       <td color="black">C</td> 
      </xsl:when> 
      <xsl:when test="$totalmark &gt; 50"> 
       <td color="black">P</td> 
      </xsl:when> 
      <xsl:otherwise> 
       <td color="red">F</td> 
      </xsl:otherwise> 
     </xsl:choose> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 

あなたのXMLに適用すると、以下のHTMLは、これはあなたのXMLで唯一ユニット要素を前提としていますか出力

<html> 
    <body> 
     <h2>Grade Report for 3311- Learn To Read</h2> 
     <p>Number of students in this unit: 3</p> 
     <table border="1"> 
     <tr> 
      <th>ID</th> 
      <th>Name</th> 
      <th>Total Mark</th> 
      <th>Grade</th> 
     </tr> 
     <tr> 
      <td>1001</td> 
      <td>Lisa Simpson</td> 
      <td>86</td> 
      <td color="blue">HD</td> 
     </tr> 
     <tr> 
      <td>1002</td> 
      <td>Barney Rubble</td> 
      <td>62</td> 
      <td color="black">P</td> 
     </tr> 
     <tr> 
      <td>1003</td> 
      <td>Donald Duck</td> 
      <td>48</td> 
      <td color="red">F</td> 
     </tr> 
     </table> 
    </body> 
</html> 

あるをお試しください。あなたの実際のXMLが複数のユニットを持っていて、別々のテーブルをそれぞれ必要とするなら、これは問題ではありません。ユニットIDがxsl:keyの一部であることを確認するだけでよいでしょう。与えられたユニットのある学生。あなたのコードで

+0

私の方法でエラーが表示されます!ティムCさん、ありがとうございました!そして、私が今試みようとしていることは、このコードのapply-templatesバージョンを動作させることです。より良い機能を備えた新しいバージョンを作成しようとする前に、知っている。 apply-templatesのw3 schools xslセクション以外のあなたが好むドキュメンテーションはありますか? – user1386559

0

非常に一目でそれはあなたのソースドキュメント内のすべての要素のための(真または偽)と同じ値を持っているので、述語

[//assessmentList/unit/assessmentItems/assessment/@studId = //assessmentList/unit/studentList/student/@sid] 

は、明らかに間違っていることが明らかになりました。

問題を修正するには、時間があるよりも多くの調査が必要です。しかし、あなたは「嫌い」の犠牲者になっているようです。