Re: [xsl] Re: Hi Dimitre, question on extra tags.

Subject: Re: [xsl] Re: Hi Dimitre, question on extra tags.
From: Ahmad J Reeves <ahmad@xxxxxxxxxxxxxx>
Date: Tue, 29 Jan 2002 15:32:59 +0000
Thanks Dimitre thats great. 

Dimitre Novatchev wrote:
> 
> --- Ahmad J Reeves <ahmad@xxxxxxxxxxxxxx> wrote:
> > Hi Dimitre,
> >
> > If you remember, you sent me this excellent stylesheet that
> > counts the number of mesages sent and received by individuals,
> > but also their movements without duplicates.
> >
> > I have discovered that 20% of my files have extra tags that need
> > parsing as well. So this stylesheet looks for <DIRECT> tags only, but
> > there are also
> >
> > <LOCAL>
> > <GLOBAL>
> > <ADMIN>
> >
> > tags with the same format as <DIRECT>, and they are all siblings at
> > the
> > same level, e.g
> >
> > <LOG>
> >   <DIRECT>
> >   <LOCAL>
> >   <GLOBAL>
> >   <ADMIN>
> > <LOG>
> >
> >
> > Is it easy to adjust this stylesheet to account for these extra
> > tags?
> 
> Hi Ahmad,
> 
> Yes, it is straightforward:
> 
> 1. Change :
>   <xsl:key name="kByID" match="DIRECT" use="CHARACTER_ID"/>
> to
>   <xsl:key name="kByID" match="DIRECT | LOCAL | GLOBAL | ADMIN"
>            use="CHARACTER_ID"/>
> 
> 2. Change all occurences of
>      LOG/DIRECT
> to
>      LOG/*
> 
> Bellow is the modified 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 | LOCAL | GLOBAL | ADMIN"
>            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/*[generate-id()
>                                     =
>                                      generate-id(key('kByID',
>                                                       CHARACTER_ID
>                                                      )[1]
>                                                  )
>                                     ]"/>
> 
>     <xsl:variable name="vUniqueCharactersReceiving"
>                   select="LOG/*/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/*/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="/LOG/*/CHARACTER_ID
>                                 [. = current()/CHARACTER_ID]">
> 
>         <xsl:if test="not(../LOCATION_ID
>                           = ../preceding-sibling::DIRECT
>                               [CHARACTER_ID = current()]
> /LOCATION_ID)">
> 
>           <xsl:value-of select="concat('    ', ../LOCATION_ID, $NL)"/>
>         </xsl:if>
> 
>       </xsl:for-each>
> 
>     </xsl:for-each>
> 
>   </xsl:template>
> </xsl:stylesheet>
> 
> When applied on the following 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>
> 
>   <LOCAL>
>     <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>
>   </LOCAL>
> 
>   <ADMIN>
>     <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>
>   </ADMIN>
> 
>   <GLOBAL>
>     <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>
>   </GLOBAL>
> 
>   <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>
> 
> The result produced is:
> 
> 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
> Character_ID: 444444:
>     45010
>     45030
>     45010
> Character_ID: 50050:
>     45000
> 
> Hope this helped.
> 
> Cheers,
> Dimitre Novatchev.
> 
> __________________________________________________
> Do You Yahoo!?
> Great stuff seeking new owners in Yahoo! Auctions!
> http://auctions.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, and Communication Research Group,
Dept of Computer Science,Queen Mary,University of London, 
E1 4NS Tel +44 (0)20 7882 5257
http://www.dcs.qmw.ac.uk/imc/
-----------------------------------------------------

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


Current Thread