绿豆.Net

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

xsl 数值相加的问题

序号   地址   凭据号   发票时间     发票号                                       发票金额     已支付金额  
  1         北京   2104025     20050404   MBS-639260-639260-90147     4,863.55   4,863.55    
  2         北京   2104025     20050404   MBS-639260-639260-90147     4,863.55   4,863.55    
  3         北京   2104025     20050404   MBS-639260-639260-90147     4,863.55   4,863.55    
                                                                                                            --------   ---------  
   
  4         天津   2104025     20050407   MBS-640042-640042-95172     86.00           86.00    
  5         天津   2104025     20050407   MBS-640042-640042-95172     86.00           86.00    
   
   
  如上   我如何跟据地址把发票金额,   已支付金额累加起来   如地址为北京的把北京的累加起来并显示出来  
  我是用XSL把XML显示成HTML   .   地址和发票金额,   已支付金额   多在同一层循环中.望高手指教.多谢!!!!  
在论坛上摘抄的,参考用
answer 1
<?xml   version="1.0"   encoding="UTF-8"?>  
  <?xml-stylesheet   type="text/xsl"   href="csdn0043.xsl"?>  
  <root>  
  <r>  
  <city>北京</city>  
  <a>4863.55</a>  
  <b>4863.55</b>  
  </r>  
  <r>  
  <city>北京</city>  
  <a>4863.55</a>  
  <b>4863.55</b>  
  </r>  
  <r>  
  <city>北京</city>  
  <a>4863.55</a>  
  <b>4863.55</b>  
  </r>  
  <r>  
  <city>天津</city>  
  <a>86.00</a>  
  <b>86.00</b>  
  </r>  
  <r>  
  <city>天津</city>  
  <a>86.00</a>  
  <b>86.00</b>  
  </r>  
  </root>  
   
  <?xml   version="1.0"   encoding="UTF-8"?>  
  <xsl:stylesheet   version="1.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <xsl:key   name="sort1"   match="r"   use="city"/>  
  <xsl:template   match="/">  
  <xsl:for-each   select="//r">  
  <xsl:if   test="position()   =   1   or     city   !=   preceding-sibling::r[1]/city">  
  <xsl:variable   name="a"   select="city"/>  
  <xsl:value-of   select="city"/>--<xsl:value-of   select="sum(key('sort1',city)/a)"/>  
  <hr/>  
  </xsl:if>  
  </xsl:for-each>  
  </xsl:template>  
  </xsl:stylesheet>

answer 2
1.xml  
  ========  
  <?xml   version="1.0"   encoding="gb2312"?>  
  <?xml-stylesheet   type="text/xsl"   href="1.xsl"   ?>  
  <root>  
  <r>  
  <city>北京</city>  
  <a>123.55</a>  
  <b>123.55</b>  
  </r>  
  <r>  
  <city>天津</city>  
  <a>86.00</a>  
  <b>86.00</b>  
  </r>  
  <r>  
  <city>北京</city>  
  <a>789.55</a>  
  <b>123.55</b>  
  </r>  
  <r>  
  <city>天津</city>  
  <a>86.00</a>  
  <b>86.00</b>  
  </r>  
  <r>  
  <city>北京</city>  
  <a>456.55</a>  
  <b>123.55</b>  
  </r>  
  </root>  
   
  1.xsl  
  =========  
  <?xml   version="1.0"   encoding="gb2312"?>  
  <xsl:stylesheet  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   version="1.0"  
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"   xmlns:fn="usercode">    
  <msxsl:script   language="javascript"   implements-prefix="fn">  
  var   citys=[];  
  function   getcity(str){  
  for(i=0;i&lt;citys.length;i++)  
      if(str==citys[i])return   "";  
  citys[citys.length]=str;  
  return   str;  
  }  
  </msxsl:script>  
  <xsl:template   match="/">  
  <xsl:apply-templates   select="//r/city"/>  
  </xsl:template>  
  <xsl:template   match="//r/city">  
  <xsl:param   name="city"   select="fn:getcity(string(.))"/>  
  <xsl:if   test="$city!=''">  
  <xsl:value-of   select="."/>发票  
  --  
  <xsl:value-of   select="sum(//r[city=$city]/a)"/>  
  <hr/>  
  <xsl:value-of   select="."/>已支付  
  --  
  <xsl:value-of   select="sum(//r[city=$city]/b)"/>  
  <hr/>  
  </xsl:if>  
  </xsl:template>  
  </xsl:stylesheet>


answer 3
1.xml  
  <?xml   version="1.0"   encoding="UTF-8"?>  
  <?xml-stylesheet   type="text/xsl"   href="csdn0043.xsl"?>  
  <root>  
  <r>  
  <city>北京</city>  
  <a>4863.55</a>  
  <b>4863.55</b>  
  </r>  
  <r>  
  <city>北京</city>  
  <a>4863.55</a>  
  <b>4863.55</b>  
  </r>  
  <r>  
  <city>北京</city>  
  <a>4863.55</a>  
  <b>4863.55</b>  
  </r>  
  <r>  
  <city>天津</city>  
  <a>86.00</a>  
  <b>86.00</b>  
  </r>  
  <r>  
  <city>天津</city>  
  <a>86.00</a>  
  <b>86.00</b>  
  </r>  
  </root>  
   
  1.xsl  
  <?xml   version="1.0"   encoding="UTF-8"?>  
  <xsl:stylesheet   version="1.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <xsl:output   method="html"/>  
  <xsl:key   name="sort1"   match="r"   use="city"/>  
  <xsl:template   match="/">  
  <table   width="100%">  
  <tr>  
  <td   width="40%">address</td>  
  <td   width="30%">amount1</td>  
  <td   width="30%">amount2</td>  
                </tr>  
  </table>  
   
  <xsl:for-each   select="//r">  
  <table   width="100%">  
   
  <tr>  
  <td   width="40%"><xsl:value-of   select="city"/></td>  
  <td   width="30%"><xsl:value-of   select="a"/></td>  
  <td   width="30%"><xsl:value-of   select="b"/></td>  
  </tr>  
         
  <!--<xsl:if   test="position()   =   1   or   city   !=   preceding-sibling::r[1]/city">-->  
  <xsl:if   test="position()   =   1   or   city   !=   preceding-sibling::r[1]/city">  
  <xsl:variable   name="a"   select="city"/>          
  <tr>  
  <td   width="40%"><xsl:value-of   select="city"/></td>  
  <td   width="30%"><xsl:value-of   select="format-number(sum(key('sort1',city)/a),'#,###.00')"/></td>  
  <td   width="30%"><xsl:value-of   select="format-number(sum(key('sort1',city)/b),'#,###.00')"/></td>  
  </tr>  
  <hr/>  
  </xsl:if>                                  
                  </table>                      
  </xsl:for-each>  
  </xsl:template>  
  </xsl:stylesheet>  
   
   
  我照回复1做数值可以按地址类加,但类加值的位置不对,我想类加值放到相同位置的最下面一行  
  如北京的类加值放到北京的下面,天津的上面.而上面的方法只能放在北京的上面一行,或者第二行.  
  请高手多指教..错误如下:  
   
  address   amount1   amount2    
  001   4863.55   4863.55    
  001   14,590.65   14,590.65    
   
  --------------------------------------------------------------------------------  
    001   4863.55   4863.55    
  001   4863.55   4863.55    
  002   86.00   86.00    
  002   172.00   172.00    
   
  --------------------------------------------------------------------------------  
    002   86.00   86.00    

answer 4
雨老大的代码,很漂亮  
  不过有个最大的问题,如果北京,天津的位置不是一起的,错开的话。。。。  
   
  <?xml   version="1.0"   encoding="gb2312"?>  
  <xsl:stylesheet  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   version="1.0"  
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"   xmlns:fn="usercode">    
  <msxsl:script   language="javascript"   implements-prefix="fn">  
  var   citys=[];  
  function   getcity(str){  
  for(i=0;i&lt;citys.length;i++)  
      if(str==citys[i])return   "";  
  citys[citys.length]=str;  
  return   str;  
  }  
  </msxsl:script>  
  <xsl:template   match="/">  
  <table   width="100%">  
  <tr>  
  <td   width="40%">address</td>  
  <td   width="30%">amount1</td>  
  <td   width="30%">amount2</td>  
                </tr>  
  </table>  
  <table>  
  <xsl:apply-templates   select="//r/city"/>  
  </table>  
  </xsl:template>  
  <xsl:template   match="//r/city">  
  <xsl:param   name="city"   select="fn:getcity(string(.))"/>  
  <xsl:if   test="$city!=''">  
  <xsl:for-each   select="//r[city=$city]">  
  <tr>  
  <td   width="40%"><xsl:value-of   select="city"/></td>  
  <td   width="30%"><xsl:value-of   select="a"/></td>  
  <td   width="30%"><xsl:value-of   select="b"/></td>  
  </tr>  
  </xsl:for-each>  
  <tr><td></td><td>  
  <xsl:value-of   select="format-number(sum(//r[city=$city]/a),'#,###.00')"/>  
  </td><td>  
  <xsl:value-of   select="format-number(sum(//r[city=$city]/b),'#,###.00')"/>  
  </td></tr>  
  <hr/>  
  </xsl:if>  
  </xsl:template>  
  </xsl:stylesheet>  


posted on 2007-05-15 10:37  杜军  阅读(608)  评论(0)    收藏  举报