Mayank
Mayank

Reputation: 27

Print sum of nodes using xslt

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

Answers (2)

kjhughes
kjhughes

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

lplatz
lplatz

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

Related Questions