Subject: [xsl] Re: Hi Dimitre, question on extra tags. From: Dimitre Novatchev <dnovatchev@xxxxxxxxx> Date: Mon, 28 Jan 2002 07:10:43 -0800 (PST) |
--- 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="'
'"/> <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: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
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Hi Dimitre, question on extra, Ahmad J Reeves | Thread | Re: [xsl] Re: Hi Dimitre, question , Ahmad J Reeves |
Re: [xsl] how to format page number, JZhang | Date | [xsl]: Context inside nested for-ea, TSchutzerWeissmann |
Month |