[xsl] Grouping & Muenchian Method Question

Subject: [xsl] Grouping & Muenchian Method Question
From: "Albert Tsun" <albert.tsun@xxxxxxxxxxxx>
Date: Wed, 3 Jan 2001 10:14:28 +0800

Hi Jenni,

Hi, I am newbie to XSL grouping and I had tried your Muenchian Method about
the "PROJECT" Example.
I can use the key() and genrate-id() to get the first level grouping. It
was fine.

However, if I want to do second level grouping with the key() and
generate-id() again, unexpected result come up.
Please see my xsl scriptlets below.

+++
XML
+++
<?xml version="1.0" encoding="UTF-8"?>
<SetDailySetRpt:DailySetRpt
xmlns:SetDailySetRpt="http://www.excel.com.hk/settlement/setdailysetrpt/";>
    <SetDailySetRpt:SettleData>
        <SetDailySetRpt:SettleItem>
            <SetDailySetRpt:ServiceCode>M</SetDailySetRpt:ServiceCode>
            <SetDailySetRpt:ServiceDescription>Hello
Hello</SetDailySetRpt:ServiceDescription>
            <SetDailySetRpt:ExchangeName>Exchange
A</SetDailySetRpt:ExchangeName>

<SetDailySetRpt:ExchangeCode>67890</SetDailySetRpt:ExchangeCode>
            <SetDailySetRpt:CCY>HKD</SetDailySetRpt:CCY>
            <SetDailySetRpt:SetDate>20001231</SetDailySetRpt:SetDate>
        </SetDailySetRpt:SettleItem>
        <SetDailySetRpt:SettleItem>
            <SetDailySetRpt:ServiceCode>M</SetDailySetRpt:ServiceCode>
            <SetDailySetRpt:ServiceDescription>Hello
Hello</SetDailySetRpt:ServiceDescription>
            <SetDailySetRpt:ExchangeName>Exchange
A</SetDailySetRpt:ExchangeName>

<SetDailySetRpt:ExchangeCode>67890</SetDailySetRpt:ExchangeCode>
            <SetDailySetRpt:CCY>HKD</SetDailySetRpt:CCY>
            <SetDailySetRpt:SetDate>20001231</SetDailySetRpt:SetDate>
        </SetDailySetRpt:SettleItem>
        <SetDailySetRpt:SettleItem>
            <SetDailySetRpt:ServiceCode>M</SetDailySetRpt:ServiceCode>
            <SetDailySetRpt:ServiceDescription>Hello
Hello</SetDailySetRpt:ServiceDescription>
            <SetDailySetRpt:ExchangeName>Exchange
A</SetDailySetRpt:ExchangeName>

<SetDailySetRpt:ExchangeCode>67890</SetDailySetRpt:ExchangeCode>
            <SetDailySetRpt:CCY>USD</SetDailySetRpt:CCY>
            <SetDailySetRpt:SetDate>20001231</SetDailySetRpt:SetDate>
        </SetDailySetRpt:SettleItem>
        <SetDailySetRpt:SettleItem>
            <SetDailySetRpt:ServiceCode>M</SetDailySetRpt:ServiceCode>
            <SetDailySetRpt:ServiceDescription>Hello
Hello</SetDailySetRpt:ServiceDescription>
            <SetDailySetRpt:ExchangeName>Exchange
A</SetDailySetRpt:ExchangeName>

<SetDailySetRpt:ExchangeCode>67890</SetDailySetRpt:ExchangeCode>
            <SetDailySetRpt:CCY>YEN</SetDailySetRpt:CCY>
            <SetDailySetRpt:SetDate>20001231</SetDailySetRpt:SetDate>
        </SetDailySetRpt:SettleItem>
        <SetDailySetRpt:SettleItem>
            <SetDailySetRpt:ServiceCode>M</SetDailySetRpt:ServiceCode>
            <SetDailySetRpt:ServiceDescription>Hello
Hello</SetDailySetRpt:ServiceDescription>
            <SetDailySetRpt:ExchangeName>Exchange
A</SetDailySetRpt:ExchangeName>

<SetDailySetRpt:ExchangeCode>67890</SetDailySetRpt:ExchangeCode>
            <SetDailySetRpt:CCY>USD</SetDailySetRpt:CCY>
            <SetDailySetRpt:SetDate>20001231</SetDailySetRpt:SetDate>
        </SetDailySetRpt:SettleItem>
        <SetDailySetRpt:SettleItem>
            <SetDailySetRpt:ServiceCode>M</SetDailySetRpt:ServiceCode>
            <SetDailySetRpt:ServiceDescription>Hello
Hello</SetDailySetRpt:ServiceDescription>
            <SetDailySetRpt:ExchangeName>Exchange
B</SetDailySetRpt:ExchangeName>

<SetDailySetRpt:ExchangeCode>12345</SetDailySetRpt:ExchangeCode>
            <SetDailySetRpt:CCY>HKD</SetDailySetRpt:CCY>
            <SetDailySetRpt:SetDate>20001231</SetDailySetRpt:SetDate>
        </SetDailySetRpt:SettleItem>
        <SetDailySetRpt:SettleItem>
            <SetDailySetRpt:ServiceCode>U</SetDailySetRpt:ServiceCode>
            <SetDailySetRpt:ServiceDescription>Hello
Hello</SetDailySetRpt:ServiceDescription>
            <SetDailySetRpt:ExchangeName>Exchange
B</SetDailySetRpt:ExchangeName>

<SetDailySetRpt:ExchangeCode>12345</SetDailySetRpt:ExchangeCode>
            <SetDailySetRpt:CCY>HKD</SetDailySetRpt:CCY>
            <SetDailySetRpt:SetDate>20001231</SetDailySetRpt:SetDate>
        </SetDailySetRpt:SettleItem>
        <SetDailySetRpt:SettleItem>
            <SetDailySetRpt:ServiceCode>U</SetDailySetRpt:ServiceCode>
            <SetDailySetRpt:ServiceDescription>Hello
Hello</SetDailySetRpt:ServiceDescription>
            <SetDailySetRpt:ExchangeName>Exchange
C</SetDailySetRpt:ExchangeName>

<SetDailySetRpt:ExchangeCode>12345</SetDailySetRpt:ExchangeCode>
            <SetDailySetRpt:CCY>HKD</SetDailySetRpt:CCY>
            <SetDailySetRpt:SetDate>20001231</SetDailySetRpt:SetDate>
        </SetDailySetRpt:SettleItem>
        <SetDailySetRpt:SettleItem>
            <SetDailySetRpt:ServiceCode>U</SetDailySetRpt:ServiceCode>
            <SetDailySetRpt:ServiceDescription>Hello
Hello</SetDailySetRpt:ServiceDescription>
            <SetDailySetRpt:ExchangeName>Exchange
C</SetDailySetRpt:ExchangeName>

<SetDailySetRpt:ExchangeCode>12345</SetDailySetRpt:ExchangeCode>
            <SetDailySetRpt:CCY>USD</SetDailySetRpt:CCY>
            <SetDailySetRpt:SetDate>20001231</SetDailySetRpt:SetDate>
        </SetDailySetRpt:SettleItem>
        <SetDailySetRpt:SettleItem>
            <SetDailySetRpt:ServiceCode>U</SetDailySetRpt:ServiceCode>
            <SetDailySetRpt:ServiceDescription>Hello
Hello</SetDailySetRpt:ServiceDescription>
            <SetDailySetRpt:ExchangeName>Exchange
D</SetDailySetRpt:ExchangeName>

<SetDailySetRpt:ExchangeCode>67890</SetDailySetRpt:ExchangeCode>
            <SetDailySetRpt:CCY>USD</SetDailySetRpt:CCY>
            <SetDailySetRpt:SetDate>20001231</SetDailySetRpt:SetDate>
        </SetDailySetRpt:SettleItem>
        <SetDailySetRpt:SettleItem>
            <SetDailySetRpt:ServiceCode>M</SetDailySetRpt:ServiceCode>
            <SetDailySetRpt:ServiceDescription>Hello
Hello</SetDailySetRpt:ServiceDescription>
            <SetDailySetRpt:ExchangeName>Exchange
D</SetDailySetRpt:ExchangeName>

<SetDailySetRpt:ExchangeCode>67890</SetDailySetRpt:ExchangeCode>
            <SetDailySetRpt:CCY>USD</SetDailySetRpt:CCY>
            <SetDailySetRpt:SetDate>20001231</SetDailySetRpt:SetDate>
            <SetDailySetRpt:TradeNum>1234567</SetDailySetRpt:TradeNum>
    </SetDailySetRpt:SettleData>
    <SetDailySetRpt:Footer>** End Of Report **</SetDailySetRpt:Footer>
</SetDailySetRpt:DailySetRpt>

+++
XSL
+++
<xsl:key name="exchange"
match="SetDailySetRpt:DailySetRpt/SetDailySetRpt:SettleData/SetDailySetRpt:
SettleItem" use="concat(SetDailySetRpt:ExchangeName, ' ',
SetDailySetRpt:ExchangeCode)"/>
<xsl:key name="service_row"
match="SetDailySetRpt:DailySetRpt/SetDailySetRpt:SettleData/SetDailySetRpt:
SettleItem" use="SetDailySetRpt:ServiceCode"/>

<xsl:template match="SetDailySetRpt:DailySetRpt">
    <xsl:apply-templates select="SetDailySetRpt:SettleData"/>
</xsl:template>

<xsl:template match="SetDailySetRpt:SettleData">
    <xsl:apply-templates

select="SetDailySetRpt:SettleItem[generate-id(.)=generate-id(key('service_r
ow',SetDailySetRpt:ServiceCode)[1])]"/>
</xsl:template>

<xsl:template match="SetDailySetRpt:SettleItem">
    <xsl:value-of select="SetDailySetRpt:ServiceCode"/>&nl;
<!--    This work fine
    <xsl:for-each select="key('service_row',SetDailySetRpt:ServiceCode)">
        <xsl:value-of select="SetDailySetRpt:ExchangeName"/> <xsl:text>
</xsl:text>
        <xsl:value-of select="SetDailySetRpt:CCY"/>
        &nl;
    </xsl:for-each>
-->
    <xsl:variable name="service_items"
select="key('service_row',SetDailySetRpt:ServiceCode)"/>
    <xsl:for-each
select="$service_items[generate-id(.)=generate-id(key('exchange',concat(Set
DailySetRpt:ExchangeName, ' ', SetDailySetRpt:ExchangeCode))[1])]">
        <xsl:value-of select="SetDailySetRpt:ExchangeName"/> <xsl:text>
</xsl:text>
        <xsl:value-of select="SetDailySetRpt:ExchangeCode"/>&nl;
    </xsl:for-each>
</xsl:template>

++
My expected should look like
++
M
Exchange A
Exchange B
Exchange D

U
Exchange B
Exchange C
Exchange D

+++
However, the actual output from above XSL
+++
M
Exchange A
Exchange B

U
Exchange C
Exchange D


Would you mind please give me some help or pointer ?
Moreover, if I want to do more grouping and sorting, is it possible and
how?

Many Thanks in advance.



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


Current Thread