XSL如何计算相同的节点名?

时间:2013-11-20 18:57:13

标签: xml xslt sum

我正在尝试找到一种计算父节点中相同节点总和的方法。

我有这个XML代码:

<course> 
  <user name="Jack"> 
    <ExerciceNote note="50" />
    <Information>The second exercice</Information>
    <ExerciceNote note="90" /> 
  </user> 
  <user name="Peter"> 
    <ExerciceNote note="60" /> 
    <ExerciceNote note="80" /> 
    <Information>The last exercice</Information>
    <ExerciceNote note="75" /> 
  </user> 
</course>

我想计算每个练习的总和:

<xsl:template match="course">
  <html>
    <body>
      <p>Student name: <xsl:apply-templates select="user" />
        <xsl:value-of select="@name" /> </p>
    </body>
  </html>
</xsl:template>

<xsl:template match="user">
  <xsl:value-of select="@name" />
  <xsl:apply-templates select="ExerciceNote" />
</xsl:template>

<xsl:template match="ExerciceNote">
  <xsl:value-of select="sum(???)" />
</xsl:template>

我尝试了很多东西来取代???

我想要一个这样的结果:

Jack
total = 140
Peter
total = 215

2 个答案:

答案 0 :(得分:2)

您不必遍历ExerciceNotes,您可以保持“用户级别”以获取所需的数据。或者更确切地说,sum()期望您指定一组具有数字内容的元素,例如,作为当前所选用户的子项的ExerciceNotes的属性@note值,而不是单个值。

试试这个XSLT样式表:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml"     
                              xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html></xsl:text>
    <html>
    <body>
      <xsl:apply-templates/>
    </body>
    </html>
  </xsl:template>

  <xsl:template match="user">
    <p><xsl:text>Student name: </xsl:text>
       <xsl:value-of select="@name"/>
    </p>
    <p><xsl:text>total = </xsl:text>
       <xsl:value-of select="sum(ExerciceNote/@note)"/>
    </p>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

另一个简单的模板

a)对每个用户进行迭代,然后计算总和

XML PlayGround

提供的帮助
<xsl:template match="*">
  <table>
    <xsl:for-each select="/course/user">
        <tr>

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

        </tr>
        <tr>
            <td>
                Total =
                <xsl:value-of select="sum(./ExerciceNote/@note)" />
            </td>
        </tr>
    </xsl:for-each>
  </table>
</xsl:template>