This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Re: using keys for counting not sorting
- From: "Ahmad J. Reeves" <ahmad at dcs dot qmul dot ac dot uk>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Mon, 31 Dec 2001 18:47:11 +0000
- Subject: Re: [xsl] Re: using keys for counting not sorting
- Reply-to: xsl-list at lists dot mulberrytech dot com
Many thanks Dimitre for your excellent answer. I'm going through
your solution to make sure I understand how it works correctly,
Cheers
Ahmad
At 12:19 AM 12/30/01 -0800, you wrote:
>Oopps...
>
>In my previous message I didn't take into account "characters" that only
received
>messages, but didn't send any.
>
>Here's the now correct solution:
>
><xsl:stylesheet version="1.0"
>xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <xsl:output method="text"/>
>
> <xsl:key name="kByID" match="DIRECT" use="CHARACTER_ID"/>
> <xsl:key name="kByTargetID" match="TARGET_CHARACTER_ID" use="."/>
>
> <xsl:variable name="vUniqueCharactersSending"
> select="LOG/DIRECT[generate-id()
> =
> generate-id(key('kByID',
> CHARACTER_ID
> )[1]
> )
> ]"/>
>
> <xsl:variable name="vUniqueCharactersReceiving"
> select="LOG/DIRECT/TARGET_CHARACTER_ID
> [generate-id()
> =
> generate-id(key('kByTargetID',
> .
> )[1]
> )
> ]"/>
>
> <xsl:variable name="vNumCharactersSending"
> select="count($vUniqueCharactersSending)"/>
>
> <xsl:variable name="vNumCharactersReceiving"
> select="count($vUniqueCharactersReceiving)"/>
>
> <xsl:variable name="vTotalSent"
> select="count(LOG/DIRECT/CHARACTER_ID)"/>
>
> <xsl:variable name="NL" select="'
'"/>
>
> <xsl:template match="/">
> <xsl:for-each select="$vUniqueCharactersSending">
> <xsl:value-of select="concat('CHARACTER_ID ',CHARACTER_ID,
> ' sent ',
> count(key('kByID',CHARACTER_ID)),
> ' messages, received ',
> count(key('kByTargetID',CHARACTER_ID)),
> $NL
> )"/>
> </xsl:for-each>
>
> <xsl:for-each select="$vUniqueCharactersReceiving
> [not(key('kByID', .))]">
>
> <xsl:value-of select="concat('CHARACTER_ID ', .,
> ' sent 0 messages, received ',
> count(key('kByTargetID',.)),
> $NL
> )"/>
> </xsl:for-each>
>
> <xsl:value-of select="$NL"/>
> <xsl:value-of select="concat('Number of characters having sent a
message: ',
> $vNumCharactersSending,
> $NL
> )"/>
>
> <xsl:value-of select="concat('Number of characters having received a
message: ',
> $vNumCharactersReceiving,
> $NL
> )"/>
>
> <xsl:value-of select="$NL"/>
> <xsl:value-of select="concat('Total sent: ',
> $vTotalSent,
> ', Average sent by a sending character: ',
> $vTotalSent div $vNumCharactersSending,
> '
',
>
> 'Total received: ',
> $vTotalSent,
> ', Average received by a receiving
character: ',
> $vTotalSent div $vNumCharactersReceiving,
> '
'
>
> )"/>
> </xsl:template>
></xsl:stylesheet>
>
>When this is applied to the following xml sorce document:
>
><LOG>
> <DIRECT>
> <COMMUNICATION_TYPE>PAGETELL</COMMUNICATION_TYPE>
> <Invoc_serial>27</Invoc_serial>
> <Serial>3087908</Serial>
> <USAGE>TELL</USAGE>
> <MESSAGE_TYPE>EMOTE</MESSAGE_TYPE>
> <CHARACTER_ID>10010</CHARACTER_ID>
> <CHARACTER_STATUS>3</CHARACTER_STATUS>
> <LOCATION_ID>45040</LOCATION_ID>
> <TARGET_CHARACTER_ID>444444</TARGET_CHARACTER_ID>
> <TARGET_CHARACTER_STATUS>6</TARGET_CHARACTER_STATUS>
> <TARGET_CHARACTER_LOCATION_ID>23222</TARGET_CHARACTER_LOCATION_ID>
> <MESSAGE>hello</MESSAGE>
> <TIME>'Mon, 26 Nov 2001 15:40:29 +0000'</TIME>
> </DIRECT>
>
> <DIRECT>
> <COMMUNICATION_TYPE>PAGETELL</COMMUNICATION_TYPE>
> <Invoc_serial>27</Invoc_serial>
> <Serial>3087908</Serial>
> <USAGE>TELL</USAGE>
> <MESSAGE_TYPE>EMOTE</MESSAGE_TYPE>
> <CHARACTER_ID>10010</CHARACTER_ID>
> <CHARACTER_STATUS>3</CHARACTER_STATUS>
> <LOCATION_ID>45040</LOCATION_ID>
> <TARGET_CHARACTER_ID>444444</TARGET_CHARACTER_ID>
> <TARGET_CHARACTER_STATUS>6</TARGET_CHARACTER_STATUS>
> <TARGET_CHARACTER_LOCATION_ID>23222</TARGET_CHARACTER_LOCATION_ID>
> <MESSAGE>hello</MESSAGE>
> <TIME>'Mon, 26 Nov 2001 15:40:29 +0000'</TIME>
> </DIRECT>
>
> <DIRECT>
> <COMMUNICATION_TYPE>PAGETELL</COMMUNICATION_TYPE>
> <Invoc_serial>27</Invoc_serial>
> <Serial>3087908</Serial>
> <USAGE>TELL</USAGE>
> <MESSAGE_TYPE>EMOTE</MESSAGE_TYPE>
> <CHARACTER_ID>444444</CHARACTER_ID>
> <CHARACTER_STATUS>3</CHARACTER_STATUS>
> <LOCATION_ID>45040</LOCATION_ID>
> <TARGET_CHARACTER_ID>10010</TARGET_CHARACTER_ID>
> <TARGET_CHARACTER_STATUS>6</TARGET_CHARACTER_STATUS>
> <TARGET_CHARACTER_LOCATION_ID>23222</TARGET_CHARACTER_LOCATION_ID>
> <MESSAGE>hello</MESSAGE>
> <TIME>'Mon, 26 Nov 2001 15:40:29 +0000'</TIME>
> </DIRECT>
>
> <DIRECT>
> <COMMUNICATION_TYPE>PAGETELL</COMMUNICATION_TYPE>
> <Invoc_serial>27</Invoc_serial>
> <Serial>3087908</Serial>
> <USAGE>TELL</USAGE>
> <MESSAGE_TYPE>EMOTE</MESSAGE_TYPE>
> <CHARACTER_ID>50050</CHARACTER_ID>
> <CHARACTER_STATUS>3</CHARACTER_STATUS>
> <LOCATION_ID>45040</LOCATION_ID>
> <TARGET_CHARACTER_ID>60060</TARGET_CHARACTER_ID>
> <TARGET_CHARACTER_STATUS>6</TARGET_CHARACTER_STATUS>
> <TARGET_CHARACTER_LOCATION_ID>23222</TARGET_CHARACTER_LOCATION_ID>
> <MESSAGE>hello</MESSAGE>
> <TIME>'Mon, 26 Nov 2001 15:40:29 +0000'</TIME>
> </DIRECT></LOG>
>
>The result is:
>
>CHARACTER_ID 10010 sent 2 messages, received 1
>CHARACTER_ID 444444 sent 1 messages, received 2
>CHARACTER_ID 50050 sent 1 messages, received 0
>CHARACTER_ID 60060 sent 0 messages, received 1
>
>Number of characters having sent a message: 3
>Number of characters having received a message: 3
>
>Total sent: 4, Average sent by a sending character: 1.3333333333333332
>Total received: 4, Average received by a receiving character:
1.3333333333333332
>
>
>Cheers,
>Dimitre.
>
>__________________________________________________
>Do You Yahoo!?
>Send your FREE holiday greetings online!
>http://greetings.yahoo.com
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
>
-------------------------------------------------
Ahmad J Reeves BSc (Hons) MSc (Dist) PhD Student
Information, Media & Communication Research Group
Department of Computer Science
Queen Mary, University of London
E1 4NS
Tel +44(0) 207 882 5257
Fax +44(0) 208 980 6533
http://www.dcs.qmw.ac.uk/imc
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list