Краткое, простое и эффективное решение XSLT 1.0 (без переменных, нет xsl:for-each
) :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kLocById" match="location" use="locationCode"/>
<xsl:template match=
"location
[generate-id()
=
generate-id(key('kLocById',locationCode)[1])
]">
<location>
<xsl:copy-of select="locationCode"/>
<totalSales>
<xsl:value-of select="sum(key('kLocById',locationCode)/sales)"/>
</totalSales>
</location>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML :
<company>
<deparment dept="001">
<location>
<locationCode>001</locationCode>
<sales>10000</sales>
</location>
<location>
<locationCode>0005</locationCode>
<sales>12500</sales>
</location>
</deparment>
<deparment dept="002">
<location>
<locationCode>001</locationCode>
<sales>40000</sales>
</location>
<location>
<locationCode>004</locationCode>
<sales>30000</sales>
</location>
</deparment>
<deparment dept="003">
<location>
<locationCode>004</locationCode>
<sales>60000</sales>
</location>
</deparment>
</company>
желаемый, правильный результат получается :
<location>
<locationCode>001</locationCode>
<totalSales>50000</totalSales>
</location>
<location>
<locationCode>0005</locationCode>
<totalSales>12500</totalSales>
</location>
<location>
<locationCode>004</locationCode>
<totalSales>90000</totalSales>
</location>
Объяснение : правильное использование мюнхенского метода для группировки и сопоставления с шаблоном.