Jumlahkan elemen yang dikelompokkan di XSL 1.0

XSL membuatku gila dan saya harap seseorang dapat membantu saya dengan yang satu ini. Kode siap untuk disalin dan ditempel.

Saya melakukan pengelompokan di XSL 1.0 dan saya ingin menjumlahkan semua elemen 'Jumlah' yang dikelompokkan.

Data saya terlihat seperti ini.

<CustInvoiceTable class="entity">
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.05</Amount>
        <ItemId>ITM-0000088</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.07</Amount>
        <ItemId>ITM-0000088</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.16</Amount>
        <ItemId>ITM-0000091</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.22</Amount>
        <ItemId>ITM-0000091</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>1.33</Amount>
        <ItemId>ITM-0000098</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>1.82</Amount>
        <ItemId>ITM-0000098</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.01</Amount>
        <ItemId>ITM-0000086</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.01</Amount>
        <ItemId>ITM-0000086</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.05</Amount>
        <ItemId>ITM-0000062</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>2</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.06</Amount>
        <ItemId>ITM-0000062</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>2</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.02</Amount>
        <ItemId>ITM-0000111</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.02</Amount>
        <ItemId>ITM-0000111</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.06</Amount>
        <ItemId>ITM-0000089</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.08</Amount>
        <ItemId>ITM-0000089</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>1.96</Amount>
        <ItemId>ITM-0000092</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>2.69</Amount>
        <ItemId>ITM-0000092</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.07</Amount>
        <ItemId>ITM-0000101</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.10</Amount>
        <ItemId>ITM-0000101</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.07</Amount>
        <ItemId>ITM-0000102</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.10</Amount>
        <ItemId>ITM-0000102</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>6.69</Amount>
        <ItemId>ITM-0000083</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>7.96</Amount>
        <ItemId>ITM-0000083</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.15</Amount>
        <ItemId>ITM-0000067</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>0.21</Amount>
        <ItemId>ITM-0000067</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>1</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>

    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>96.00</Amount>
        <ItemId>ITM-0000125</ItemId>
        <McsCmBilProductItem class="entity">
            <CgiBundleLines>0</CgiBundleLines>
        </McsCmBilProductItem>
    </McsCmBilCalcInvoiceLine>

    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>-88.00</Amount>
        <ItemId>ITM-0000069</ItemId>
    </McsCmBilCalcInvoiceLine>

    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>-0.66</Amount>
        <ItemId>ITM-0000083</ItemId>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>-0.22</Amount>
        <ItemId>ITM-0000092</ItemId>
    </McsCmBilCalcInvoiceLine>
    <McsCmBilCalcInvoiceLine class="entity">
        <Amount>-0.55</Amount>
        <ItemId>ITM-0000098</ItemId>
    </McsCmBilCalcInvoiceLine>

</CustInvoiceTable>

Dan XSLnya:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="Lines-by-ItemId" match="CustInvoiceTable/McsCmBilCalcInvoiceLine" use="CustInvoiceTable/McsCmBilCalcInvoiceLine/ItemId" />

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">

        <root>

            <xsl:for-each select="CustInvoiceTable/McsCmBilCalcInvoiceLine[count(. | key('Lines-by-ItemId', ItemId)[1]) = 1][McsCmBilProductItem/CgiBundleLines = 1][not(ItemId = preceding-sibling::McsCmBilCalcInvoiceLine/ItemId)]">
                <xsl:sort select="ItemId" />
                <GroupInvoiceLine>
                    <ItemId><xsl:value-of select="ItemId" /></ItemId>
                    <SumAmount><xsl:value-of select="sum(Amount)"/></SumAmount> <!-- This does not work -->
                </GroupInvoiceLine>
            </xsl:for-each>

        </root>

    </xsl:template>

</xsl:stylesheet>

Hasilnya: Katakanlah kita mengelompokkan pada "ITM-0000088" Saya berharap hasilnya 0,12. Saat ini baru meraih rekor pertama.

Jika kita mengelompokkan pada "ITM-0000083" saya berharap jumlahnya menjadi 6,69 + 7,96 = 14,65 dan BUKAN 6,69 + 7,96 + -0,66 = 13,99 karena 'McsCmBilCalcInvoiceLine' terakhir dengan 'ItemId = ITM-0000083' tidak memiliki 'CgiBundleLines = 1' di 'McsCmBilProductItem'-nya.


person Lange    schedule 07.03.2016    source sumber
comment
Anda memiliki banyak kode di sini. Silakan posting Contoh Minimal, Lengkap, Dapat Diverifikasi (MCVE)   -  person Mark Skelton    schedule 07.03.2016
comment
Ya - saya akan mengurangi jumlah datanya di lain waktu. Terima kasih.   -  person Lange    schedule 07.03.2016


Jawaban (2)


Tentukan kuncinya sebagai <xsl:key name="Lines-by-ItemId" match="CustInvoiceTable/McsCmBilCalcInvoiceLine" use="ItemId" />, karena nilai atribut use dihitung relatif terhadap node yang cocok.

Kemudian untuk melihat terlebih dahulu cara menggunakan kunci dan pengelompokan Muenchian, gunakan

        <xsl:for-each select="CustInvoiceTable/McsCmBilCalcInvoiceLine[count(. | key('Lines-by-ItemId', ItemId)[1]) = 1]">
            <xsl:sort select="ItemId" />
            <GroupInvoiceLine>
                <ItemId><xsl:value-of select="ItemId" /></ItemId>
                <SumAmount><xsl:value-of select="sum(key('Lines-by-ItemId', ItemId)/Amount)"/></SumAmount> 
            </GroupInvoiceLine>
        </xsl:for-each>

Adapun kondisi lainnya, pertimbangkan untuk memasukkannya ke dalam pola kunci:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="Lines-by-ItemId" match="CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1]" use="ItemId" />

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">

        <root>

            <xsl:for-each select="CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1][count(. | key('Lines-by-ItemId', ItemId)[1]) = 1]">
                <xsl:sort select="ItemId" />
                <GroupInvoiceLine>
                    <ItemId><xsl:value-of select="ItemId" /></ItemId>
                    <SumAmount><xsl:value-of select="sum(key('Lines-by-ItemId', ItemId)/Amount)"/></SumAmount> 
                </GroupInvoiceLine>
            </xsl:for-each>

        </root>

    </xsl:template>

</xsl:stylesheet>
person Martin Honnen    schedule 07.03.2016
comment
Pekerjaan yang brilian lagi. Terima kasih. - person Lange; 07.03.2016

Pertama, kunci Anda harus didefinisikan sebagai:

<xsl:key name="Lines-by-ItemId" match="McsCmBilCalcInvoiceLine" use="ItemId" />

Kemudian ubah:

<SumAmount><xsl:value-of select="sum(Amount)"/></SumAmount>

to:

<SumAmount><xsl:value-of select="sum(key('Lines-by-ItemId',ItemId)/Amount)"/></SumAmount>
person michael.hor257k    schedule 07.03.2016
comment
Ini tidak memberikan hasil yang diinginkan. Tidak dipertimbangkan bahwa hanya baris dengan 'CgiBundleLines = 1' yang boleh dikelompokkan. Terima kasih. - person Lange; 07.03.2016
comment
@Lange Anda dapat menambahkan predikat ke grup yang dijumlahkan. (Bukanlah strategi yang baik untuk menanyakan lebih dari satu hal pada saat yang bersamaan). - person michael.hor257k; 07.03.2016
comment
Terima kasih Michael. Kamu mungkin benar. Saya akan menahan diri dari hal ini di masa depan. - person Lange; 07.03.2016