以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  求助:xslt或xquery中求sum()时结果值不准确(小数点后位数过多)的解决办法  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=15863)


--  作者:hanll
--  发布时间:3/21/2005 2:34:00 PM

--  求助:xslt或xquery中求sum()时结果值不准确(小数点后位数过多)的解决办法
如题,sum("\\Grade")时,结果值有时不对  小数点后有时会增加了好多位

请问,有没有什么好的解决办法? 3Q


--  作者:doubleG
--  发布时间:3/21/2005 4:52:00 PM

--  
能把你的简化程序贴出来吗?这样有个参照大家才能更好的给你想办法啊

--  作者:hanll
--  发布时间:3/21/2005 5:06:00 PM

--  
xml文件:

<?xml version='1.0' encoding='GB2312'?>
    
<Layout>
   <ROW num="1">
      <F281>于小姐</F281>
      <F286>12</F286>
      <F284>&Ouml;í&Egrave;&acirc;</F284>
      <F287>168</F287>
      <F285>14</F285>
      <F283>1</F283>
   </ROW>
   <ROW num="2">
      <F281>于小姐</F281>
      <F286>12</F286>
      <F284>&sup2;&Uacute;&Atilde;×</F284>
      <F287>98</F287>
      <F285>9.8</F285>
      <F283>2</F283>
   </ROW>
   <ROW num="3">
      <F281>于小姐</F281>
      <F286>12</F286>
      <F284>&Euml;á&Auml;&Igrave;&Agrave;&Ograve;</F284>
      <F287>174</F287>
      <F285>34.8</F285>
      <F283>3</F283>
   </ROW>
   <ROW num="4">
      <F281>谢小姐</F281>
      <F286>9</F286>
      <F284>&Eacute;&sup3;&sup2;è</F284>
      <F287>167.4</F287>
      <F285>18.6</F285>
      <F283>4</F283>
   </ROW>
   <ROW num="5">
      <F281>谢小姐</F281>
      <F286>9</F286>
      <F284>&Ouml;í&Egrave;&acirc;&cedil;&Eacute;</F284>
      <F287>1696</F287>
      <F285>42.4</F285>
      <F283>5</F283>
   </ROW>
   <ROW num="6">
      <F281>谢小姐</F281>
      <F286>10</F286>
      <F284>&Iuml;&ordm;×&Oacute;</F284>
      <F287>77</F287>
      <F285>7.7</F285>
      <F283>6</F283>
   </ROW>
   <ROW num="7">
      <F281>谢小姐</F281>
      <F286>35</F286>
      <F284>&Ouml;í&Egrave;&acirc;&cedil;&Eacute;</F284>
      <F287>1484</F287>
      <F285>42.4</F285>
      <F283>7</F283>
   </ROW>
</Layout>
=======================================
xslt文件如下:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0" xmlns:math="http://exslt.org/math"  extension-element-prefixes="math">


<!--exsl:function name="num:sum">
   <xsl:param name="node-set" select="/.." />
   <xsl:param name="expr" select="'.'" />
   <xsl:variable name="value-of-first"
                    select="number(com:eval($node-set[1], $expr))" />
   <xsl:choose>
      <xsl:when test="count($node-set) <= 1">
         <exsl:result select="$value-of-first" />
      </xsl:when>
      <xsl:otherwise>
         <exsl:result select="$value-of-first +
                                 num:sum($node-set[position() != 1], $expr)" />
      </xsl:otherwise>
   </xsl:choose>
</exsl:function-->
 
 <xsl:template match="Layout">
  <HTML>
   <HEAD>
    <TITLE>City Data</TITLE>
   </HEAD>
   <BODY>
    <H1>City Data</H1>
    <TABLE BORDER="1" CELLPADDING="5">
     <xsl:for-each-group group-by="F281" select="ROW">
      <TR>
       <TD>
        <xsl:value-of select="F281"/>
       </TD>
       <xsl:for-each-group select="current-group()" group-by="F286">
                <TD>
          <xsl:value-of select="F286"/>
         </TD>
            
        
       <TD>
Number:      <xsl:value-of select="sum(current-group()/F285)"/>
       </TD>
       <TD>
Text:      <xsl:value-of select="current-group()/F284" separator="/"/>
       </TD>
       </xsl:for-each-group>
      </TR>
      
     </xsl:for-each-group>
    </TABLE>
   </BODY>
  </HTML>
 </xsl:template>
</xsl:stylesheet>

=======================================

编译:
java net.sf.saxon.Transform groupxsl.xml groupxsl.xsl >groupxsl.html

结果页面:
<HTML>
   <HEAD>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   
      <TITLE>City Data</TITLE>
   </HEAD>
   <BODY>
      <H1>City Data</H1>
      <TABLE BORDER="1" CELLPADDING="5">
         <TR>
            <TD>余小姐</TD>
            <TD>12</TD>
            <TD>
               Number:      58.599999999999994
            </TD>
            <TD>
               Text:      猪肉/糙米/酸奶酪
            </TD>
         </TR>
         <TR>
            <TD>谢小姐</TD>
            <TD>9</TD>
            <TD>
               Number:      61
            </TD>
            <TD>
               Text:      沙茶/猪肉干
            </TD>
            <TD>10</TD>
            <TD>
               Number:      7.7
            </TD>
            <TD>
               Text:      虾子
            </TD>
            <TD>35</TD>
            <TD>
               Number:      42.4
            </TD>
            <TD>
               Text:      猪肉干
            </TD>
         </TR>
      </TABLE>
   </BODY>
</HTML>

================================
58.599999999999994 !!!!!


--  作者:doubleG
--  发布时间:3/21/2005 5:29:00 PM

--  
哦,这个问题啊,呵呵。没有办法这个是XSLT中对于浮点的处理,可以先乘上一个10^n,然后做完加法后再除以10^n就好了:)
--  作者:hanll
--  发布时间:3/21/2005 5:57:00 PM

--  
10^n ?? 是什么意思?
--  作者:hanll
--  发布时间:3/21/2005 5:58:00 PM

--  
怎么改xslt呢?sum(current-group()/F285) 改成什么?
--  作者:doubleG
--  发布时间:3/24/2005 8:57:00 AM

--  
呵呵,10^n就是10的n次方啊,就是要把你的数搞大些,然后再除就好了,然后再缩小回去啊。
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms