xsl-list
[Top] [All Lists]

Summating/grouping

2003-06-18 05:50:35

I know, I know... This sort of thing has been asked many times. However, I
am not clear/understand why I do not have any results appearing.

using this xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="c:\temp\a.xsl"?>
<Invoice>
        <InvoiceLine Line="1">
                <Charge Type="Tax">
                        <TaxRate Code="E">0.0</TaxRate>
                        <Value>0.00</Value>
                </Charge>
        </InvoiceLine>
        <InvoiceLine Line="2">
                <Charge Type="Tax">
                        <TaxRate Code="S">17.5</TaxRate>
                        <Value>12.50</Value>
                </Charge>
        </InvoiceLine>
        <InvoiceLine Line="3">
                <Charge Type="Tax">
                        <TaxRate Code="E">0.0</TaxRate>
                        <Value>0.00</Value>
                </Charge>
        </InvoiceLine>
        <InvoiceLine Line="4">
                <Charge Type="Tax">
                        <TaxRate Code="S">17.5</TaxRate>
                        <Value>15.00</Value>
                </Charge>
        </InvoiceLine>
        <InvoiceLine Line="5">
                <Charge Type="Tax">
                        <TaxRate Code="Z">0.0</TaxRate>
                        <Value>0.00</Value>
                </Charge>
        </InvoiceLine>
</Invoice>


I would like to achieve...

<TaxSummary>
    <Tax Code="S">
        <Rate>17.5</Rate>
        <LinesAtRate>2</LinesAtRate>
        <Value>27.50</Value>
    </Tax>
    <Tax Code="E">
        <Rate>0.0</Rate>
        <LinesAtRate>2</LinesAtRate>
        <Value>0.0</Value>
    </Tax>
    <Tax Code="Z">
        <Rate>17.5</Rate>
        <LinesAtRate>1</LinesAtRate>
        <Value>0.0</Value>
    </Tax>
</TaxSummary>


I try using this XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
        <!--    I am hoping that this builds up a list of all the items by Tax 
rate
code -->
        <xsl:key name="TAX" match="/Invoice/InvoiceLine/Charge[(_at_)Type =
'Tax']/TaxRate" use="@Code"/>
        <xsl:template match="/">
                <TaxSummary>
                        <!--    I am hoping that this will return the first 
element of each of the
Tax codes, i.e. 'S', 'E', 'Z' -->
                        <xsl:for-each 
select="/Invoice/InvoiceLine/Charge[(_at_)Type =
'Tax']/TaxRate/@Code[generate-id(.)=generate-id(key('TAX', @Code)[1])]">
                                <!-- this should be the TaxRate Code -->
                                <xsl:variable name="CODE" select="."/>
                                <Tax Code="{$CODE}">
                                        <Rate>
                                                <xsl:value-of select="TaxRate"/>
                                        </Rate>
                                        <LinesAtRate>
                                                <xsl:value-of 
select="count(/Invoice/InvoiceLine/Charge[(_at_)Type =
'Tax']/TaxRate[(_at_)Code = $CODE])"/>
                                        </LinesAtRate>
                                        <Value>
                                                <xsl:value-of 
select="sum(/Invoice/InvoiceLine/Charge[(_at_)Type =
'Tax']/TaxRate[(_at_)Code = $CODE]/../Value)"/>
                                        </Value>
                                </Tax>
                        </xsl:for-each>
                </TaxSummary>
        </xsl:template>
</xsl:stylesheet>



Many thanks

Rob



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>