RE: [xsl] sum() function giving strange result

Subject: RE: [xsl] sum() function giving strange result
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 14 Dec 2004 08:56:34 -0000
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.Elovirta@xxxxxxxxx>
> >Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
> >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
> >
> 
> _________________________________________________________________
> Searching for your soulmate? Zero in on the perfect choice. 
> http://www.astroyogi.com/newmsn/astrodate/ Try MSN Astrodate now!

Current Thread