2016-09-14 90 views
1

如何在xslt中编写程序来打印以下xml的总和而不使用任何扩展功能?使用xslt打印节点总数

<?xml version="1.0" encoding="UTF-8"?> 
<numbers> 
    <number>1</number> 
    <number>2</number> 
    <number>3</number> 
    <number>4</number> 
    <number>5</number> 
    <number>6</number> 
    <number>7</number> 
    <number>8</number> 
    <number>9</number> 
</numbers> 
+0

你想不使用''来做这个吗? – lplatz

+0

谢谢@Iplatz。其实我正在寻找这是否可以使用递归解决。 – Mayank

回答

1

这确实应该使用<xsl:value-of select='sum(number)'/>来完成,因为XSLT不允许自己更改变量。如果你真的想这样做,不这样做,你可以使用递归(这将打印出45 .相当于所有这些<number>x</number元素的总和)

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="numbers"> 
    <xsl:value-of select='sum(number)'/> 
    <xsl:for-each select="number"> 
    <xsl:call-template name="dots"> 
     <xsl:with-param name="count" select="."/> 
    </xsl:call-template> 
    </xsl:for-each> 
    </xsl:template> 

<xsl:template name="dots"> 
    <xsl:param name="count" select="1"/> 
    <xsl:if test="$count > 0"> 
    <p>.</p> 
    <xsl:call-template name="dots"> 
     <xsl:with-param name="count" select="$count - 1"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

这个例子来自http://www.ibm.com/developerworks/xml/library/x-tiploop/index.html

1

使用sum(),这是一个的XPath 1.0功能因此XSLT的部分1.0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text"/> 
    <xsl:template match="/"> 
    <xsl:value-of select="sum(/numbers/number)"/> 
    </xsl:template> 
</xsl:stylesheet> 

将输出

45 

您的输入XML。