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

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="'&#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


Current Thread