This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Hi Dimitre, question on extra tags.
- From: Dimitre Novatchev <dnovatchev at yahoo dot com>
- To: Ahmad J Reeves <ahmad at dcs dot qmul dot ac dot uk>
- Cc: xsl list <XSL-List at lists dot mulberrytech dot com>
- Date: Mon, 28 Jan 2002 07:10:43 -0800 (PST)
- Subject: [xsl] Re: Hi Dimitre, question on extra tags.
- Reply-to: xsl-list at lists dot mulberrytech dot com
--- 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