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() > > > < $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() > >< $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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] sum() function giving str, Arun Sinha | Thread | RE: [xsl] sum() function giving str, Jarno.Elovirta |
[xsl] Different (body) layout on od, Christian Rosberg | Date | RE: FW: [xsl] Siblings, Michael Kay |
Month |