В этом случае сначала необходимо выполнить группировку, а затем агрегирование.Вам необходимо сгруппировать элементы по уровню фолио 1, уровню 2 фолио и имени элемента.Для этого вы обычно используете метод мюнхенской группировки.
Во-первых, вы определяете xsl: key , который можно использовать для группировки всех соответствующих элементов вместе
<xsl:key name="lines" match="reporting:line" use="
concat(
concat(
concat(ancestor::reporting:folio[@reporting:level='1']/@reporting:name, ','),
concat(ancestor::reporting:folio[@reporting:level='2']/@reporting:name, ',')
),
@reporting:name
)" />
Далее необходимо выбрать первый соответствующий элемент в каждой группе.
<xsl:apply-templates select="//reporting:line
[generate-id() =
generate-id(key('lines', ...concatenated key... )[1])]" />
Затем это «простой» случай суммирования всех элементов, соответствующих ключу поиска
<xsl:value-of select="sum(key('lines', $keyName)/reporting:number)" />
Если сложить все вместе, то получится
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:reporting="testing">
<xsl:output method="text" indent="yes"/>
<xsl:key name="lines" match="reporting:line" use="concat(concat(concat(ancestor::reporting:folio[@reporting:level='1']/@reporting:name, ','), concat(ancestor::reporting:folio[@reporting:level='2']/@reporting:name, ',')), @reporting:name)" />
<xsl:template match="/">
<xsl:apply-templates select="//reporting:line[generate-id() = generate-id(key('lines', concat(concat(concat(ancestor::reporting:folio[@reporting:level='1']/@reporting:name, ','), concat(ancestor::reporting:folio[@reporting:level='2']/@reporting:name, ',')), @reporting:name))[1])]" />
</xsl:template>
<xsl:template match="reporting:line">
<xsl:variable name="keyName" select="concat(concat(concat(ancestor::reporting:folio[@reporting:level='1']/@reporting:name, ','), concat(ancestor::reporting:folio[@reporting:level='2']/@reporting:name, ',')), @reporting:name)" />
<xsl:value-of select="$keyName" />
<xsl:text>,</xsl:text>
<xsl:value-of select="sum(key('lines', $keyName)/reporting:number)" />
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
. Применительно к вашему образцу XML результат будет следующим:
topfolder1,folder2,element1,625
topfolder1,folder2,element2,665
topfolder2,folder24,element3,65525
topfolder2,folder24,element4,490