This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Re: Hi Dimitre, question on extra tags.
- From: Ahmad J Reeves <ahmad at dcs dot qmul dot ac dot uk>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Tue, 29 Jan 2002 15:32:59 +0000
- Subject: Re: [xsl] Re: Hi Dimitre, question on extra tags.
- Organization: Dept of Computer Science, QMW
- References: <20020128151043.38272.qmail@web14505.mail.yahoo.com>
- Reply-to: xsl-list at lists dot mulberrytech dot com
Thanks Dimitre thats great.
Dimitre Novatchev wrote:
>
> --- Ahmad J Reeves <ahmad@dcs.qmul.ac.uk> 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
--
-----------------------------------------------------
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