[xsl] Re: distinct moves problem

Subject: [xsl] Re: distinct moves problem
From: "Ahmad J. Reeves" <ahmad@xxxxxxxxxxxxxx>
Date: Fri, 18 Jan 2002 16:32:52 +0000
Hi Dimitre,

Many thanks for that solution, It worked perfectly on the smaller
file I tested it on. I am parsing xml files that are roughly 20meg
and even after 4hrs of processing it still hadnt finished! Due
to time constraints I actually had to go to the old version and
count them manually ignoring the duplicates! Anyway, I'll have to 
get a faster machine. Many thanks Dimitre.

Another question I have is that would it be possible to alter the
same stylesheet so that it could produce a list of all of the locations
in ascending order and the total number of people who were in that location 
without the duplicates i.e. where they sent more than one message in the
same room e.g.

Location   # Characters
12343           12
12355           44
13655           133
54333           66

etc etc?

Many thanks again for your time and help,

Ahmad

At 06:26 AM 1/9/02 -0800, you wrote:
>Hi Ahmad,
>
>I'm still not sure I understand well, but here's a possible solution:
>
>1. Change the definition of the "kLocByCharacter" to:
>
>  <xsl:key name="kLocByCharacter"
>           match="LOCATION_ID[not(.
>                                  =
>                                  ../preceding-sibling::DIRECT[1]
>                                                /LOCATION_ID)
>                              ]"
>           use="../CHARACTER_ID"/>
>
>2. The key "kLocByValandChar" is no-longer needed -- may be removed.
>
>3. The end of the stylesheet should now be:
>
>    <xsl:value-of select="$NL"/>
>    <xsl:value-of select="concat('Room moves by character:', $NL)"/>
>
>    <xsl:for-each select="$vUniqueCharactersSending">
>      <xsl:value-of select="concat('Character_ID: ',
>                                   CHARACTER_ID,
>                                   ':',
>                                   $NL
>                                   )"/>
>      <xsl:for-each select="key('kLocByCharacter',CHARACTER_ID)">
>
>
>        <xsl:value-of select="concat('    ', ., $NL)"/>
>
>      </xsl:for-each>
>
>    </xsl:for-each>
>
>  </xsl:template>
></xsl:stylesheet>
>
>
>Bellow is the complete stylesheet:
>
><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:key name="kLocByCharacter"
>           match="LOCATION_ID[not(.
>                                  =
>                                  ../preceding-sibling::DIRECT[1]
>                                                /LOCATION_ID)
>                              ]"
>           use="../CHARACTER_ID"/>
>
>  <xsl:key name="kLocByValandChar"
>           match="LOCATION_ID"
>           use="concat(., '|', ../CHARACTER_ID)"/>
>
>    <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="'&#xA;'"/>
>
>  <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,
>                                  '&#xA;',
>
>                                  'Total received: ',
>                                   $vTotalSent,
>                                  ', Average received by a receiving
character: ',
>                                  $vTotalSent div $vNumCharactersReceiving,
>                                  '&#xA;'
>
>                                 )"/>
>
>    <xsl:value-of select="$NL"/>
>    <xsl:value-of select="concat('Room moves by character:', $NL)"/>
>
>    <xsl:for-each select="$vUniqueCharactersSending">
>      <xsl:value-of select="concat('Character_ID: ',
>                                   CHARACTER_ID,
>                                   ':',
>                                   $NL
>                                   )"/>
>      <xsl:for-each select="key('kLocByCharacter',CHARACTER_ID)">
>
>
>        <xsl:value-of select="concat('    ', ., $NL)"/>
>
>      </xsl:for-each>
>
>    </xsl:for-each>
>
>  </xsl:template>
></xsl:stylesheet>
>
>
>With this source xml 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>10010</CHARACTER_ID>
>    <CHARACTER_STATUS>3</CHARACTER_STATUS>
>    <LOCATION_ID>45020</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>45010</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>444444</CHARACTER_ID>
>    <CHARACTER_STATUS>3</CHARACTER_STATUS>
>    <LOCATION_ID>45030</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>444444</CHARACTER_ID>
>    <CHARACTER_STATUS>3</CHARACTER_STATUS>
>    <LOCATION_ID>45030</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>444444</CHARACTER_ID>
>    <CHARACTER_STATUS>3</CHARACTER_STATUS>
>    <LOCATION_ID>45010</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>45000</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>
>
>
>It produces:
>
>CHARACTER_ID 10010 sent 4 messages, received 4
>CHARACTER_ID 444444 sent 4 messages, received 4
>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: 9, Average sent by a sending character: 3
>Total received: 9, Average received by a receiving character: 3
>
>Room moves by character:
>Character_ID: 10010:
>    45040
>    45020
>    45040
>Character_ID: 444444:
>    45010
>    45030
>    45010
>Character_ID: 50050:
>    45000
>
>
>
>Cheers,
>Dimitre.
>
>
>
>__________________________________________________
>Do You Yahoo!?
>Send FREE video emails in Yahoo! Mail!
>http://promo.yahoo.com/videomail/
>
-------------------------------------------------
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


Current Thread