如何在XSLT中将值与其他特定元素相加

时间:2013-01-27 12:33:14

标签: xslt

我有一个像这样的transcript.xml,想要计算gpa

    <?xml version="1.0" encoding="UTF-8"?>
<transcript>
    <courses>
        <course>
            <code>IK2210</code>        
            <credits>3</credits>
            <grade>A</grade>
        </course>
        <course>
            <code>IB2210</code>
            <credits>3</credits>
            <grade>A</grade>
        </course>
        <course>
            <code>IB2210</code>
            <credits>1</credits>
            <grade>C</grade>
        </course>
        <course>
            <code>ID1234</code>
            <credits>2</credits>
            <grade>B</grade>
        </course>
    </courses>

</transcript>

我像这样导入了成绩单

<xsl:variable name="transcript" select="document('transcript2.xml')/transcript"/> 

我试图这样做

<xsl:value-of select=" (4*(sum($transcript/courses/course/credits[$transcript/courses/course/grade='A'])) + 3*(sum($transcript/courses/course/credits[$transcript/courses/course/grade='B'])) + 2*(sum($transcript/courses/course/credits[$transcript/courses/course/grade='C'])) + 1*(sum($transcript/courses/course/credits[$transcript/courses/course/grade='D']))) div (sum($transcript/courses/course/credits))"/>

但是部分

(sum($transcript/courses/course/credits[$transcript/courses/course/grade='A']))

总结所有学分

如何检查病情? 感谢

1 个答案:

答案 0 :(得分:2)

我相信如果不使用以下代码,您的公式就会有效:

(sum($transcript/courses/course/credits[$transcript/courses/course/grade='A']))

您使用过:

(sum($transcript/courses/course[grade='A']/credits))

但也许这更简洁:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:key name="kGrade" match="credits" use="../grade"/>

  <xsl:template match="/">
    <root>
      <xsl:variable name="transcript" select="document('SOTranscript.xml')/transcript" />
      <xsl:apply-templates select="$transcript" mode="getTotal" />
    </root>
  </xsl:template>

  <xsl:template match="transcript" mode="getTotal">
    <xsl:value-of
            select="(4 * sum(key('kGrade', 'A')) + 
                  3 * sum(key('kGrade', 'B')) + 
                  2 * sum(key('kGrade', 'C')) + 
                  sum(key('kGrade', 'D'))
                 ) div sum(courses/course/credits)"/>
  </xsl:template>
</xsl:stylesheet>

在样本输入上使用时,结果为:

<root>3.5555555555555553</root>

我认为这是期望值。