XSLT 分组总和

XSLT grouping sum

目前,我正在使用具有以下结构的 XML 文件:

<TA_CREDITO>
    <item>
        <VTWEG/>
        <LIMITE_CREDITO>2.00</LIMITE_CREDITO>
        <MONTO_CONSUMIDO>400.00</MONTO_CONSUMIDO>
        <MONTO_COMPROMETIDO>600.00</MONTO_COMPROMETIDO>
        <DISPONIBLE>3000.00</DISPONIBLE>
         <TIPO_CREDITO>E</TIPO_CREDITO>
    </item>
    <item>
        <VTWEG>11</VTWEG>
        <LIMITE_CREDITO>964251.00</LIMITE_CREDITO>
        <MONTO_CONSUMIDO>184176.44</MONTO_CONSUMIDO>
        <MONTO_COMPROMETIDO>0.00</MONTO_COMPROMETIDO>
        <DISPONIBLE>780074.56</DISPONIBLE>
        <TIPO_CREDITO>C</TIPO_CREDITO>
    </item>
    <item>
        <VTWEG>12</VTWEG>
        <LIMITE_CREDITO>300000.00</LIMITE_CREDITO>
        <MONTO_CONSUMIDO>0.00</MONTO_CONSUMIDO>
        <MONTO_COMPROMETIDO>0.00</MONTO_COMPROMETIDO>
        <DISPONIBLE>300000.00</DISPONIBLE>
        <TIPO_CREDITO>C</TIPO_CREDITO>
    </item>
</TA_CREDITO>

如您所见,有几个“item”,每个“item”都有一个“tipo_credito”,可以有2个不同的值。我需要的是生成一个新文件,具有类似的结构,但是添加了常见的“tipo_credito”方法的属性。我 return 例如:

<item>
        <VTWEG/>
        <LIMITE_CREDITO>2.00</LIMITE_CREDITO>
        <MONTO_CONSUMIDO>400.00</MONTO_CONSUMIDO>
        <MONTO_COMPROMETIDO>600.00</MONTO_COMPROMETIDO>
        <DISPONIBLE>3000.00</DISPONIBLE>
         <TIPO_CREDITO>E</TIPO_CREDITO>
    </item>
    <item>
        <VTWEG>11</VTWEG>
        <LIMITE_CREDITO>1.264.251</LIMITE_CREDITO>
        <MONTO_CONSUMIDO>184176.44</MONTO_CONSUMIDO>
        <MONTO_COMPROMETIDO>0.00</MONTO_COMPROMETIDO>
        <DISPONIBLE>1.080.074.56</DISPONIBLE>
        <TIPO_CREDITO>C</TIPO_CREDITO>
    </item>

我有这些,但是 if 不工作

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <!-- Tomar Informaciòn XML Retornado -->
    <xsl:template match="/">
            <EX_BLOQUEO>
                   <xsl:value-of select="//EX_BLOQUEO"/>
            </EX_BLOQUEO>
             <EX_MOROSIDAD>
                   <xsl:value-of select="//EX_MOROSIDAD"/>
             </EX_MOROSIDAD>
             <xsl:for-each select="//item">
                 <items>
                     <xsl:if test="TIPO_CREDITO = C">
                     <LIMITE_CREDITO>
                        <xsl:value-of select="sum(//LIMITE_CREDITO)"/>
                    </LIMITE_CREDITO>
                    </xsl:if>
                
                    <xsl:if test="TIPO_CREDITO = ">
                     <LIMITE_CREDITO>
                        <xsl:value-of select="sum(//LIMITE_CREDITO)"/>
                    </LIMITE_CREDITO>
                    </xsl:if>
                 </items>
            </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

请尝试以下 XSLT。

它正在使用分组来汇总组中的所有相关元素。

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" expand-text="yes">
    <xsl:output indent="yes" method="xml"/>

    <xsl:template match="/TA_CREDITO">
        <xsl:copy>
            <xsl:for-each-group select="item" group-by="TIPO_CREDITO">
                <item>
                    <VTWEG>{sum(current-group()/VTWEG/number())}</VTWEG>
                    <LIMITE_CREDITO>{format-number(sum(current-group()/LIMITE_CREDITO), '#,##0.00')}</LIMITE_CREDITO>
                    <MONTO_CONSUMIDO>{format-number(sum(current-group()/MONTO_CONSUMIDO), '#,##0.00')}</MONTO_CONSUMIDO>
                    <MONTO_COMPROMETIDO>{format-number(sum(current-group()/MONTO_COMPROMETIDO), '#,##0.00')}</MONTO_COMPROMETIDO>
                    <DISPONIBLE>{format-number(sum(current-group()/DISPONIBLE), '#,##0.00')}</DISPONIBLE>
                    <TIPO_CREDITO>{current-grouping-key()}</TIPO_CREDITO>
                </item>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>