Суммирование значений уникальных комбинаций в 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 можно использовать, но не знаю, как это реализовать.


person Hsa    schedule 04.04.2018    source источник


Ответы (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>
person Mads Hansen    schedule 04.04.2018