This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Grouping & Muenchian Method Question
- To: xsl-list at lists dot mulberrytech dot com, jeni dot tennison at epistemics dot co dot uk
- Subject: [xsl] Grouping & Muenchian Method Question
- From: "Albert Tsun" <albert dot tsun at excel dot com dot hk>
- Date: Wed, 3 Jan 2001 10:14:28 +0800
- Reply-To: xsl-list at lists dot mulberrytech dot com
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