2012-05-10 2 views
0

왜 내 변수 할당 된 합계가 작동하지 않는지 알아 내려고 노력했습니다. 또한 내 테이블 출력은 전체 테이블을 통해 첫 번째 요소 만 반복합니다. 이 코드를 얻으려는 시도는 첫 번째 열에 인쇄 된 각 학생의 studentID, 두 번째 열에 해당 ID의 학생 이름을 입력 한 다음 학생이 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:variable name="totalmark" select="sum(key('marks', @sid))" /> 

마지막으로 의견

, XSL을 사용하는 것이 더 문제가되지는 않았지만 : 적용 템플릿 오히려 XSL보다 : for-each은 과도한 들여 쓰기를 방지하고 더 나은 코드 재사용을 허용합니다. 당신의 XML에 적용하면

는 다음 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> 

을 시도, 다음과 같은 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

나는 내 방식대로 오류를 봅니다! 도와 줘서 고마워, Tim C! 예, 지금 시도 할 것은이 코드의 apply-templates 버전을 사용하는 것입니다. 더 나은 기능으로 새 버전을 만들기 전에 일련의 코드를 작동시키고 싶습니다. knowlesges 술. apply-templates의 w3 schools xsl 섹션 이외에 자신이 선호하는 문서가 있습니까? – user1386559

0

매우 빠른 눈은 당신의 원본 문서의 모든 요소 (true 또는 false) 같은 값을 가지고 있기 때문에 술어

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

은 분명히 잘못된 것 알 수있다.

문제를 수정하려면 시간이 있어야합니다. 그러나 당신이 희생당한 것처럼 보입니다. "작동하지 않으면 '앞면에'오류가 생깁니다.