摘要
长期以来,如何将行数据转换成列数据一直是个很普遍的问题。
本文介绍用XSL转换XML的方法。XML的数据取自数据库的行数据,然后用XSL转换输出为列数据。
示例中,用GroupID元素表示为行数据,用TradeID表示转换后的列数据。
用xsl:key为每个GroupID生成唯一key。
变量1stGroupID为GroupID所有子树的入口。用<xsl:value-of ...>得到列值。
每个GroupID都调用ShowTradesInGroup模板。
在ShowTradesInGroup模板中,循环得到GroupID的所有子树。
XML数据(数据库表中各行纪录):
<?xml version="1.0"?>
<MarketConformity>
<RiskRow>
<GroupID>244133L</GroupID>
<TradeID>244133L_EUR_STUB</TradeID>
</RiskRow>
<RiskRow>
<GroupID>325866L</GroupID>
<TradeID>325866L_EUR_STUB</TradeID>
</RiskRow>
<RiskRow>
<GroupID>244133L</GroupID>
<TradeID>325867L_EUR_STUB1</TradeID>
</RiskRow>
<RiskRow>
<GroupID>502722L</GroupID>
<TradeID>502722L_EUR_STUB</TradeID>
</RiskRow>
<RiskRow>
<GroupID>244133L</GroupID>
<TradeID>325867L_EUR_STUB2</TradeID>
</RiskRow>
<RiskRow>
<GroupID>502722L</GroupID>
<TradeID>502722L_EUR_STUB1</TradeID>
</RiskRow>
<RiskRow>
<GroupID>502722L</GroupID>
<TradeID>502722L_EUR_STUB2</TradeID>
</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="1stGroupID"><xsl:value-of select="GroupID"/></xsl:variable>
<xsl:value-of select="$1stGroupID" />
<xsl:variable name="1stTradeID" select="//RiskRow[GroupID=$1stGroupID]"/>
<xsl:call-template name="ShowTradesInGroup">
<xsl:with-param name="1stTradeID" select="$1stTradeID" />
</xsl:call-template>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
<!--用ShowTradesInGroupID模板找出指定GroupID的所有Trade-->
<xsl:template name="ShowTradesInGroup">
<xsl:param name="1stTradeID"/>
<xsl:for-each select="$1stTradeID">
<xsl:text>, </xsl:text>
<!-- 在这里给出列的值 -->
<xsl:value-of select="TradeID" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
结果输出为:
244133L, 244133L_EUR_STUB, 325867L_EUR_STUB1, 325867L_EUR_STUB2
325866L, 325866L_EUR_STUB
502722L, 502722L_EUR_STUB, 502722L_EUR_STUB1, 502722L_EUR_STUB2