xsl-list
[Top] [All Lists]

RE: sum() function giving strange result

2004-12-14 01:56:34

XSLT 2.0 supports decimal arithmetic as well as floating point.

But with 1.0, your best bet is simply to use format-number() to round the
results to the required precision.

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


Thanks a lot for the information.

Well, it does work if the values of are of upto 2 decimal places.

But the problem is my stylesheet is a generic one and is 
being applied to
different XML files. The other XML may contain values upto 3 
or 4 decimal 
places.

So I can't use a value of 100 for multiplication and division.

But your reply definately has given me an idea, how to achieve it.

I am planning to count the digits after decimal and then apply 
multiplication and
division accordingly.

Any other idea?

Arun


From: <Jarno(_dot_)Elovirta(_at_)nokia(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Subject: RE: [xsl] sum() function giving strange result
Date: Tue, 14 Dec 2004 08:34:45 +0200

Hi,

The sum funciton is giving some strange result.

Xml :-
<documents>
  <value>10.11</value>
  <value>20.22</value>
  <value>30.33</value>
  <value>40.44</value>
  <value>50.55</value>
  <value>10.11</value>
  <value>20.22</value>
</documents>

XSL :-
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xmlns:exsl="urn:schemas-microsoft-com:xslt"
                extension-element-prefixes="exsl">

<xsl:variable name="SubTotals">
  <xsl:for-each  select="/documents/value">
    <value><xsl:value-of select="." /></value>
  </xsl:for-each>
</xsl:variable>

<xsl:template match="/">
    <xsl:apply-templates select="documents/value" />
</xsl:template>

<xsl:template match="value">
     <xsl:variable name="Position" select="position()" />
     <xsl:value-of
select="sum(exsl:node-set($SubTotals)/value[position()
&lt; $Position])" /><br />
</xsl:template>

</xsl:stylesheet>


The result :-
0
10.11
30.33
60.66
101.1
151.64999999999998
161.76

I am worried about the output 151.64999999999998. Why is it
outputting this
value?

Because XPath uses a floating-point numbers 
<http://www.w3.org/TR/xpath#numbers>.

I am expecting to be upto 2 decimal places or 1 decimal places.

Well I can mask it upto 2 decimal places but I do not have a
liberty to do
that.

How about

  <xsl:variable name="SubTotals">
    <xsl:for-each  select="/documents/value">
      <value>
        <xsl:value-of select=". * 100" />
      </value>
    </xsl:for-each>
  </xsl:variable>
  ...
  <xsl:template match="value">
    <xsl:variable name="Position" select="position()" />
    <xsl:value-of 
select="sum(exsl:node-set($SubTotals)/value[position() 
&lt; $Position]) div 100" />
    <br />
  </xsl:template>

Seems to give the expecter result.

0
10.11
30.33
60.66
101.1
151.65
161.76

Cheers,

Jarno

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


_________________________________________________________________
Searching for your soulmate? Zero in on the perfect choice. 
http://www.astroyogi.com/newmsn/astrodate/ Try MSN Astrodate now!


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--