XSLT 1.0 будет использовать мюнхенскую группировку.
Я думаю, что в этом случае вы группируете дважды.Сначала вы группируете по InvestmentAccount элементам, поэтому вам понадобится ключ, подобный
<xsl:key name="Accounts" match="InvestmentAccount"
use="concat(@Type, '|', @InvestmentStrategyId)" />
И затем вам также нужно сгруппировать по Investment элементов внутриaccount.
<xsl:key name="Investments" match="Investment"
use="concat(../@Type, '|', ../@InvestmentStrategyId, '|', @FundName)" />
Обратите внимание на использование трубы в concatenetion.Это может быть любой символ, но он должен быть тем, который не входит ни в один из атрибутов.
Чтобы сгруппировать по InvestmentAccount элементам, вы можете просто сопоставить первый элемент в каждой группе.например:
<xsl:apply-templates
select="InvestmentAccount[
generate-id() =
generate-id(key('Accounts', concat(@Type, '|', @InvestmentStrategyId))[1])]" />
И, попав в группу, вы можете получить все элементы Investment , например, так:
<xsl:apply-templates
select="//InvestmentAccount
[@Type=current()/@Type]
[@InvestmentStrategyId = current()/@InvestmentStrategyId]/Investment
[generate-id() =
generate-id(key('Investments',
concat(../@Type, '|', ../@InvestmentStrategyId, '|', @FundName))[1])]" />
Вот полный XSLT (Обратите внимание, что я предположил, что корневой элемент с именем Investments
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="Accounts" match="InvestmentAccount" use="concat(@Type, '|', @InvestmentStrategyId)" />
<xsl:key name="Investments" match="Investment" use="concat(../@Type, '|', ../@InvestmentStrategyId, '|', @FundName)" />
<xsl:template match="/Investments">
<xsl:apply-templates select="InvestmentAccount[generate-id() = generate-id(key('Accounts', concat(@Type, '|', @InvestmentStrategyId))[1])]" />
</xsl:template>
<xsl:template match="InvestmentAccount">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates select="//InvestmentAccount[@Type=current()/@Type][@InvestmentStrategyId = current()/@InvestmentStrategyId]/Investment[generate-id() = generate-id(key('Investments', concat(../@Type, '|', ../@InvestmentStrategyId, '|', @FundName))[1])]" />
</xsl:copy>
</xsl:template>
<xsl:template match="Investment">
<xsl:copy>
<xsl:copy-of select="@FundName" />
<xsl:attribute name="FundValue"><xsl:value-of select="format-number(sum(key('Investments', concat(../@Type, '|', ../@InvestmentStrategyId, '|', @FundName))/@FundValue), '0.00')" /></xsl:attribute>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
При применении к вашему образцу XML (с корневым элементом Investments) выводится следующее:
<InvestmentAccount Id="Element01_Source3_Sequqence002" Type="Standard" InvestmentStrategyId="Employer" ParameterOverrideIds="AllocationRateOverride">
<Investment FundName="Fund032" FundValue="4754.82" />
<Investment FundName="Fund034" FundValue="4643.48" />
<Investment FundName="Fund035" FundValue="2509.46" />
<Investment FundName="Fund038" FundValue="7104.71" />
<Investment FundName="Fund042" FundValue="4244.08" />
</InvestmentAccount>
<InvestmentAccount Id="Element01_Source4_Sequence003" Type="DWPRebate" InvestmentStrategyId="DSS" ParameterOverrideIds="DWPAllocationRateOverride">
<Investment FundName="Fund032" FundValue="1881.76" />
<Investment FundName="Fund034" FundValue="1584.18" />
<Investment FundName="Fund035" FundValue="872.99" />
<Investment FundName="Fund038" FundValue="2899.53" />
<Investment FundName="Fund042" FundValue="1762.62" />
</InvestmentAccount>
<InvestmentAccount Id="Element01_Source2_Sequence001" Type="Standard" InvestmentStrategyId="Employee" ParameterOverrideIds="AllocationRateOverride">
<Investment FundName="Fund032" FundValue="7395.91" />
<Investment FundName="Fund034" FundValue="7222.72" />
<Investment FundName="Fund035" FundValue="3903.52" />
<Investment FundName="Fund038" FundValue="11051.32" />
<Investment FundName="Fund042" FundValue="6602.54" />
</InvestmentAccount>
<InvestmentAccount Id="Element02_Source2_Sequence004" Type="TransferNonPR" InvestmentStrategyId="Employee" ParameterOverrideIds="AllocationRateOverride">
<Investment FundName="Fund032" FundValue="11056.71" />
<Investment FundName="Fund034" FundValue="12401.34" />
<Investment FundName="Fund035" FundValue="6634.86" />
<Investment FundName="Fund038" FundValue="16545.00" />
<Investment FundName="Fund042" FundValue="10036.26" />
<Investment FundName="fictiousextra" FundValue="1414.00" />
</InvestmentAccount>
Я не был уверен, как вам нужны атрибуты для сгруппированного элемента InvestmentAccount , но, надеюсь, вы можете изменить это самостоятельно.