Reputation: 27
How can I write a program in xslt to print sum of following xml without using any extension functions?
<?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>
Upvotes: 1
Views: 61
Reputation: 111630
Use sum()
, which is an XPath 1.0 function and therefore part of 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>
will output
45
for your input XML.
Upvotes: 1
Reputation: 101
This really should be done using <xsl:value-of select='sum(number)'/>
because XSLT doesn't allow altering of variables yourself. If you really want to do this without that, you can use recursion: (this will print out 45 .
which equals the sum of all of those <number>x</number
elements)
<?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>
This example is from http://www.ibm.com/developerworks/xml/library/x-tiploop/index.html
Upvotes: 1