XML中的分组与求和
这是个XSLT技巧,通过generate-id()产生GroupID,并通过GroupID进行分组以及对组内的PV值求和。
XML代码:
<?xml version="1.0"?>
<MarketConformity>
<RiskRow>
<GroupID>244133L</GroupID>
<TradeID>244133L_EUR_STUB</TradeID>
<PVinEuro1>-11121619.203</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>325866L</GroupID>
<TradeID>325866L_EUR_STUB</TradeID>
<PVinEuro1>-12121619.2938</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>325867L</GroupID>
<TradeID>325867L_EUR_STUB</TradeID>
<PVinEuro1>-14121619.293864</PVinEuro1>
</RiskRow>
<RiskRow><GroupID>502722L</GroupID>
<TradeID>502722L_EUR_STUB</TradeID>
<PVinEuro1>-13121543.293643</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>502722L</GroupID>
<TradeID>502722L_PLN_STUB</TradeID>
<PVinEuro1>-11234329.698236</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>325866L</GroupID>
<TradeID>506593L_EUR_STUB</TradeID>
<PVinEuro1>-11134543.12963</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>244133L</GroupID>
<TradeID>542056L_EUR_STUB</TradeID>
<PVinEuro1>-12342342.769823</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>325867L</GroupID>
<TradeID>553257L_PLN_STUB</TradeID>
<PVinEuro1>-98745908.128361</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>570079L</GroupID>
<TradeID>570079L</TradeID>
<PVinEuro1>-64325623.693286</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>570079L</GroupID>
<TradeID>570084L_EUR_STUB</TradeID>
<PVinEuro1>-67824233.986723</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>244133L</GroupID>
<TradeID>570090L</TradeID>
<PVinEuro1>-56721463.972345</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>325866L</GroupID>
<TradeID>570096L</TradeID>
<PVinEuro1>-87623763.23442</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>325867L</GroupID>
<TradeID>570098L</TradeID>
<PVinEuro1>-79843267.4232</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>244133L</GroupID>
<TradeID>570099L</TradeID>
<PVinEuro1>-87246234.23423</PVinEuro1>
</RiskRow>
<RiskRow>
<GroupID>325866L</GroupID>
<TradeID>570106L</TradeID>
<PVinEuro1>-32423896.4732</PVinEuro1>
</RiskRow>
</MarketConformity>
XSLT代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "text" omit-xml-declaration="no" standalone="no" indent="yes" />
<xsl:key name = "keyGroupID" match ="RiskRow" use = "GroupID" />
<xsl:template match="/">
<xsl:for-each select = "//RiskRow[generate-id(.)=generate-id(key('keyGroupID',GroupID)[1])]">
<xsl:variable name="lngGroupID"><xsl:value-of select="GroupID"/></xsl:variable>
<xsl:text>The groupID is =</xsl:text>
<xsl:value-of select="$lngGroupID" />
<xsl:text>|</xsl:text>
<xsl:variable name="1stTradeID" select="//RiskRow[GroupID=$lngGroupID]"/>
<xsl:call-template name="ShowEmployeesInTeam">
<xsl:with-param name="1stTradeID" select="$1stTradeID" />
</xsl:call-template>
<!--Put carriage return and linefeed character -->
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template name="ShowEmployeesInTeam">
<xsl:param name="1stTradeID"/>
<!--Show the details of Employee currently being processes -->
<xsl:for-each select="$1stTradeID">
<!--Include the columns here-->
<xsl:value-of select="TradeID" /> <xsl:text> </xsl:text>
<xsl:value-of select="PVinEuro1" /><xsl:text>|</xsl:text>
</xsl:for-each>
<xsl:text>Sum is = </xsl:text>
<!--Summation on PVinEuro1 and format the number till 6 decimal point-->
<xsl:value-of select='format-number(sum($1stTradeID/PVinEuro1),"###############.######")' />
</xsl:template>
</xsl:stylesheet>
问题点数:20、回复次数:6Top
1 楼kingsoft111()回复于 2002-08-26 09:46:12 得分 5
感谢Chinaok兄对我们的指导,
受益非浅Top
2 楼jfly()回复于 2002-08-26 09:46:45 得分 5
非常感谢,正来找这个就撞倒了。
不过有2个错误。
1、xml中有全角的空格,出错。一开始没发现,奇怪了半天……
2、xsl中使用1stTradeID作变量名错误,难道你测试可以通过?Top
3 楼zlgun(自由人)回复于 2002-08-26 09:51:20 得分 5
真是好东东,我找这个好久了
Cooktop里要是有这个多好呀
收藏!!!Top
4 楼zlgun(自由人)回复于 2002-08-26 10:08:45 得分 5
确实有第二个错误
自己改一下变量名吧Top
5 楼jfly()回复于 2002-08-26 10:51:56 得分 0
其实微软的XMLSDK4里面就有比较好的例子,只不过是英文的。Top
6 楼fa2002(风翔万里)回复于 2002-12-13 18:54:40 得分 0
upTop




