Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:key name="kTransByCode"
match="Transaction" use="TransCode"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Transactions">
<Transactions>
<xsl:apply-templates select=
"Transaction[generate-id()
=
generate-id(key('kTransByCode',
TransCode
)[1]
)
]
">
<xsl:sort select="TransCode" data-type="number"/>
</xsl:apply-templates>
</Transactions>
</xsl:template>
<xsl:template match="TransAmt">
<TransAmt>
<xsl:value-of select=
"sum(key('kTransByCode',../TransCode)/TransAmt)"/>
</TransAmt>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному XML-документу :
<Transactions>
<Transaction>
<TransCode>0008</TransCode>
<TransType>Purchase</TransType>
<TransAmt>12.30</TransAmt>
</Transaction>
<Transaction>
<TransCode>0002</TransCode>
<TransType>Cash</TransType>
<TransAmt>26.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0008</TransCode>
<TransType>Purchase</TransType>
<TransAmt>25.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0015</TransCode>
<TransType>FinanceCharge</TransType>
<TransAmt>25.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0002</TransCode>
<TransType>Cash</TransType>
<TransAmt>50.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0008</TransCode>
<TransType>Purchase</TransType>
<TransAmt>40.00</TransAmt>
</Transaction>
</Transactions>
создает искомое, правильный результат :
<Transactions>
<Transaction>
<TransCode>0002</TransCode>
<TransType>Cash</TransType>
<TransAmt>76</TransAmt>
</Transaction>
<Transaction>
<TransCode>0008</TransCode>
<TransType>Purchase</TransType>
<TransAmt>77.3</TransAmt>
</Transaction>
<Transaction>
<TransCode>0015</TransCode>
<TransType>FinanceCharge</TransType>
<TransAmt>25</TransAmt>
</Transaction>
</Transactions>
Обратите внимание :
Используется мюнхенский метод группировки .
Использование ключей позволяет легко и эффективно суммировать за транскод.
Правило идентификациииспользуется для копирования большинства элементов как есть и переопределяется шаблонами, совпадающими с элементами, которые будут отличаться в выходных данных.