XSLT 1.0 分组 [英] XSLT 1.0 Grouping
本文介绍了XSLT 1.0 分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要对以下 XML 应用 XSLT 1.0 转换:
I need to apply XSLT 1.0 transformation to following XML:
<ProfitLossFinancials>
<ProfitLossFinancial>
<Year>2013</Year>
<Turnover>13</Turnover>
<Profit>13</Profit>
</ProfitLossFinancial>
<ProfitLossFinancial>
<Year>2012</Year>
<Turnover>12</Turnover>
<Profit>12</Profit>
</ProfitLossFinancial>
</ProfitLossFinancials>
<BalanceSheetFinancials>
<BalanceSheetFinancial>
<Year>2013</Year>
<FixedAssets>13</FixedAssets>
</BalanceSheetFinancial>
<BalanceSheetFinancial>
<Year>2011</Year>
<FixedAssets>11</FixedAssets>
</BalanceSheetFinancial>
</BalanceSheetFinancials>
具有以下输出:
<Financials>
<Financial>
<Year>2013</Year>
<Turnover>13</Turnover>
<Profit>13</Profit>
<FixedAssets>13</FixedAssets>
</Financial>
<Financial>
<Year>2012</Year>
<Turnover>12</Turnover>
<Profit>12</Profit>
<FixedAssets/>
</Financial>
<Financial>
<Year>2011</Year>
<Turnover/>
<Profit/>
<FixedAssets>11</FixedAssets>
</Financial>
</Financials>
怎么做?
推荐答案
请试试这个:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="kFinancialByYear"
match="*[self::ProfitLossFinancial or self::BalanceSheetFinancial]"
use="Year" />
<xsl:variable name="af"
select="//*[self::ProfitLossFinancial or
self::BalanceSheetFinancial]"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<Financials>
<xsl:apply-templates select="$af[generate-id() =
generate-id(key('kFinancialByYear', Year)[1])]"
mode="group" />
</Financials>
</xsl:template>
<xsl:template match="*" mode="group">
<xsl:variable name="thisYearValues" select="key('kFinancialByYear', Year)" />
<Financial>
<xsl:apply-templates select="Year" />
<Turnover>
<xsl:value-of select="$thisYearValues/Turnover"/>
</Turnover>
<Profit>
<xsl:value-of select="$thisYearValues/Profit"/>
</Profit>
<FixedAssets>
<xsl:value-of select="$thisYearValues/FixedAssets"/>
</FixedAssets>
</Financial>
</xsl:template>
</xsl:stylesheet>
在此输入上运行时:
<n>
<ProfitLossFinancials>
<ProfitLossFinancial>
<Year>2013</Year>
<Turnover>13</Turnover>
<Profit>13</Profit>
</ProfitLossFinancial>
<ProfitLossFinancial>
<Year>2012</Year>
<Turnover>12</Turnover>
<Profit>12</Profit>
</ProfitLossFinancial>
</ProfitLossFinancials>
<BalanceSheetFinancials>
<BalanceSheetFinancial>
<Year>2013</Year>
<FixedAssets>13</FixedAssets>
</BalanceSheetFinancial>
<BalanceSheetFinancial>
<Year>2011</Year>
<FixedAssets>11</FixedAssets>
</BalanceSheetFinancial>
</BalanceSheetFinancials>
</n>
结果是:
<Financials>
<Financial>
<Year>2013</Year>
<Turnover>13</Turnover>
<Profit>13</Profit>
<FixedAssets>13</FixedAssets>
</Financial>
<Financial>
<Year>2012</Year>
<Turnover>12</Turnover>
<Profit>12</Profit>
<FixedAssets></FixedAssets>
</Financial>
<Financial>
<Year>2011</Year>
<Turnover></Turnover>
<Profit></Profit>
<FixedAssets>11</FixedAssets>
</Financial>
</Financials>
这篇关于XSLT 1.0 分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文