Суммирование уникальных комбинационных значений в XSLT

Я пытаюсь сгруппировать и суммировать уникальную комбинацию узлов в XML.

<root>
    <row>
        <field1>720</field1>
        <field2>8900</field2>
        <field3>100</field3>        
    </row>
    <row>
        <field1>720</field1>
        <field2>99998</field2>        
        <field3>120</field3>       
    </row>
    <row>
        <field1>720</field1>
        <field2>8900</field2>
        <field3>130</field3>        
    </row>
    <row>
        <field1>720</field1>
        <field2>12403</field2>
        <field3>130</field3>        
    </row>
</root>

Итак, для каждой уникальной комбинации field1 и field2 мне нужно получить сумму field3

Я понимаю, что group-by - это то, что можно использовать, но не знаю, как это реализовать.

1 ответ

Ниже приведен пример того, как вы можете использовать xsl:for-each-group а также group-by значения field1 а также field2 элементы для каждой строки. Для каждой группы произведите sum() из field3 элементы и @key чтобы продемонстрировать значения группирующего ключа:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <summary>
            <xsl:for-each-group select="/root/row" 
                                group-by="string-join((field1,field2),'-')">
                <sum key="{current-grouping-key()}">
                    <xsl:value-of select="sum(current-group()/field3)" />
                </sum>
            </xsl:for-each-group>
        </summary>
    </xsl:template>
</xsl:stylesheet>

При запуске с данными примера он выдает следующий вывод:

<summary>
   <sum key="720-8900">230</sum>
   <sum key="720-99998">120</sum>
   <sum key="720-12403">130</sum>
</summary>
Другие вопросы по тегам