XSL仅在节点内计算特定节点

时间:2013-08-29 12:04:30

标签: xml xslt

我正在尝试设置一个xslt文件,该文件从包含许多<student>标签的xml文件中读取,并且在每个学生中,他们可以有多个包含课程信息的<course>标签。

xslt文件读取每个学生在一个表格中打印出来的循环,但是我在尝试计算每个学生所拥有的课程数量时却遇到了麻烦,但是当你这么做时它会做什么

<xsl:value-of select="count(//student/course)" />

它列出了每个学生的课程总共21个。我希望它尝试,让这个学生有2个课程,然后当我打印下一个学生时,它列出了学生有多少课程,例如。 3,等等。任何想法如何设置计数,所以它只是每个学生只有它的课程而不是所有的?

2 个答案:

答案 0 :(得分:3)

有很多方法可以实现这一目标。多一点代码可以帮助缩小范围,但我们可以解决这个问题。我建议的是代替count(//student/course)调用应用模板,然后选择每个学生元素并输出count(course),就像你拥有当前代码一样:

 <xsl:apply-templates/>

并添加此模板以输出计数

<xsl:template match="student">
    <xsl:value-of select="count(course)" />
</xsl:template>

应该这样做。哦,你可以在网上测试一下:

http://www.xsltcake.com/slices/TF0Yji

答案 1 :(得分:1)

假设您拥有以下源XML:

<?xml version="1.0" encoding="UTF-8"?>
<list>
<student>
 <course>two</course>
 <course>three</course>
</student>
<student>
 <course>ten</course>
 <course>nine</course>
 <course>six</course>
</student>
</list>

并应用此XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
    <list>
        <xsl:apply-templates/>
    </list>
</xsl:template>

<xsl:template match="student">
    <xsl:param name="pos">
        <xsl:value-of select="position()"/>
    </xsl:param>

    <number>
    <xsl:text>Student number </xsl:text>  
     <xsl:value-of select="$pos"/>
    <xsl:text> has </xsl:text>
        <xsl:value-of select="count(course)"/>
     <xsl:text> courses.</xsl:text>
    </number>
</xsl:template>

你得到这个输出:

<?xml version="1.0" encoding="UTF-8"?>
<list>
 <number>Student number 1 has 2 courses.</number>
 <number>Student number 2 has 3 courses.</number>
</list>

请始终提供源XML和已检测的输出XML。另外,请提供您目前为止所使用的XSLT - 让人们更容易理解您的问题。

祝你好运, 彼得