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<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<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>
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<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<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>

浙公网安备 33010602011771号