2013-08-29 75 views
1

我试图设置一个xslt文件,该文件从xml文件中读取,其中包含一些<student>标签,每个学生可以有多个包含课程信息的<course>标签。XSL计算特定节点只在一个节点

XSLT文件读取每个学生的循环打印出来的表格,但我有麻烦试图做的课程,每个学生都有数的计数,但是当你做它

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

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

回答

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

+0

谢谢,我加了的标签来我的XSLT文件和它的工作完美,在每个学生加入课程单独而不是所有学生的所有课程。知道一旦有人指出它会很简单。再次欢呼 – benh11858

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和exptected输出XML。还请提供您迄今为止一直在努力的XSLT - 使人们更容易理解您的问题。

最好的问候, 彼得