RE: [xsl] Sum produces NaN

Subject: RE: [xsl] Sum produces NaN
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Mon, 13 Sep 2004 19:41:56 +0100
Firstly, why are you doing this with a recursive template rather than by
using the sum() function?

Secondly, why are you doing this:

<xsl:variable name="first">
  <xsl:apply-templates select="$set-of-order[1]/data"/>
</xsl:variable>

rather than

<xsl:variable name="first" select="$set-of-order[1]/data"/>

However, whichever way you do it, it's easy enough to include conditional
logic to exclude the empty data elements. For example, you can write:

sum(b/data[.!=''])

Michael Kay
http://www.saxonica.com/





> -----Original Message-----
> From: James Steven [mailto:JSteven@xxxxxxxxxxxxxxxxxxxxx]
> Sent: 13 September 2004 16:01
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Sum produces NaN
>
> Hello
> To add a column of numbers I am using the xsl below.  However
> if there is
> one value missing in the column then the xsl produces NaN.
>
> eg. Below is xml with a value missing in last <data>.  I then
> use the xsl
> below to add all <data> values but receive NaN because of the
> missing value.
> If all <data> tags have value then the sum works.  Please
> could anyone show
> how to resolve this.  Any help greatly appreciated.
>
> <a>
>   <b>
> 	<data>1</data>
>   </b>
>   <b>
>       <data>2</data>
>   </b>
>   <b>
>       <data>5</data>
>   </b>
>   <b>
>       <data></data>
>   </b>
> </a>
>
>
> <xsl:template name="orderlist.sum.edit">
> 	<xsl:param name="set-of-order"/>
> 		 <xsl:variable name="sumorg">
> 		  	<xsl:call-template name="orderlist.sum">
> 		  	    <xsl:with-param name="set-of-order"
> select="$set-of-order"/>
> 		  	</xsl:call-template>
> 		  </xsl:variable>
> 	<xsl:value-of select='format-number($sumorg,
> "####,###,##0.00")'/>
> </xsl:template>
>
> <xsl:template name="orderlist.sum">
> 	<xsl:param name="set-of-order"/>
> 		<xsl:choose>
> 		  	 <xsl:when test="$set-of-order">
> 		  			<xsl:variable name="first">
>
> <xsl:apply-templates select="$set-of-order[1]/data"/>
> 		  			</xsl:variable>
> 		  			<xsl:variable name="rest">
> 		  		<xsl:call-template name="orderlist.sum">
> 		  			 <xsl:with-param
> name="set-of-order" select="$set-of-order[position()
> != 1]"/>
> 		  				</xsl:call-template>
> 		  			</xsl:variable>
> 		  				<xsl:value-of
> select="$first + $rest"/>
> 		  			</xsl:when>
> 		  			<xsl:otherwise>0</xsl:otherwise>
> 		  	 </xsl:choose>
> 		  </xsl:template>

Current Thread