摘要 长期以来,如何将行数据转换成列数据一直是个很普遍的问题。 本文介绍用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

|