This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
preceeding:sibling?
- From: Ahmad J Reeves <ahmad at dcs dot qmul dot ac dot uk>
- To: xsl list <XSL-List at lists dot mulberrytech dot com>
- Cc: Ahmad Reeves <ahmad at dcs dot qmul dot ac dot uk>
- Date: Fri, 05 Apr 2002 14:21:23 +0100
- Subject: [xsl] preceeding:sibling?
- Organization: Dept of Computer Science, QMW
- Reply-to: xsl-list at lists dot mulberrytech dot com
Hi,
For a sample of my xml below, I have written a stylesheet that lists all
the unique rooms from the <LOCATION_ID> attribute and then lists all of
the people from the <CHARACTER_ID> attribute that visited that room. As
a person can sit in a room and send lots of messages I needed to remove
any duplicate ID's until they left the room and came back in.
So for example say ID number 3455 is in room 1111 and sends 6 messages
and then moves to room 2222 and then comes back to 1111:-
what actually happens =
Room no:1111
3455
3455
3455
3455
3455
3455
3455 * he's come back here
room no:2222
3455
What I actually need is
Room no:1111
3455 * he comes in here but all future messages ignored until he leaves
4322
8976
4532
1324
3455 * he's come back here
room no:2222
3455
----------------------------------------------------------------
So I wrote this stylesheet to do the job:-
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:key name="kByID" match="LOG/*" use="LOCATION_ID" />
<xsl:key name="kLocations" match="LOCATION_ID" use="." />
<xsl:variable name="vUniqueCharactersSending"
select="LOG/*[generate-id() = generate-id(key('kByID', LOCATION_ID )[1]
) ]" />
<xsl:variable name="vRooms" select="LOG/*/LOCATION_ID [generate-id() =
generate-id(key('kLocations', . )[1] ) ]" />
<xsl:variable name="NL" select="' '" />
<xsl:template match="/">
<xsl:value-of select="$NL" />
<xsl:for-each select="$vUniqueCharactersSending">
<xsl:value-of select="concat('Room', LOCATION_ID, ':', $NL )" />
<xsl:for-each select="/LOG/*/LOCATION_ID [. =
current()/LOCATION_ID]">
<xsl:if test="not(../CHARACTER_ID =
../preceding-sibling::DIRECT
[LOCATION_ID = current()][1]/CHARACTER_ID)">
<xsl:value-of select="concat(' ',
../CHARACTER_ID, $NL)" />
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
-----------------------------------------------------------------------
but I'm still getting what actually happens instead of what I actually
need. I can't see if my preceeding sibling test is deficient in any way.
Any ideas gratefully received,
Regards
A.
Sample xml:
<LOG>
<DIRECT>
<COMMUNICATION_TYPE> PAGETELL </COMMUNICATION_TYPE>
<Invoc_serial> 29 </Invoc_serial>
<Serial> 19461910 </Serial>
<USAGE> TELL </USAGE>
<MESSAGE_TYPE> EMOTE </MESSAGE_TYPE>
<CHARACTER_ID> 10010 </CHARACTER_ID>
<CHARACTER_STATUS> 6 </CHARACTER_STATUS>
<LOCATION_ID> 24488 </LOCATION_ID>
<TARGET_CHARACTER_ID> 18735 </TARGET_CHARACTER_ID>
<TARGET_CHARACTER_STATUS> 6 </TARGET_CHARACTER_STATUS>
<TARGET_CHARACTER_LOCATION_ID> 10433
</TARGET_CHARACTER_LOCATION_ID>
<MESSAGE> %#NF#%wthinks %y%l. o O ( %w%lThinks of a new
prefix/suffix.%y%l ) </MESSAGE>
<TIME> 'Tue, 01 Jan 2002 20:27:50 +0000' </TIME>
</DIRECT>
<DIRECT>
<COMMUNICATION_TYPE> PAGETELL </COMMUNICATION_TYPE>
<Invoc_serial> 29 </Invoc_serial>
<Serial> 19461911 </Serial>
<USAGE> TELL </USAGE>
<MESSAGE_TYPE> EMOTE </MESSAGE_TYPE>
<CHARACTER_ID> 10010 </CHARACTER_ID>
<CHARACTER_STATUS> 6 </CHARACTER_STATUS>
<LOCATION_ID> 24488 </LOCATION_ID>
<TARGET_CHARACTER_ID> 23212 </TARGET_CHARACTER_ID>
<TARGET_CHARACTER_STATUS> 3 </TARGET_CHARACTER_STATUS>
<TARGET_CHARACTER_LOCATION_ID> 293 </TARGET_CHARACTER_LOCATION_ID>
<MESSAGE> %#NF#%wthinks %y%l. o O ( %w%lThinks of a new
prefix/suffix.%y%l ) </MESSAGE>
<TIME> 'Tue, 01 Jan 2002 20:27:50 +0000' </TIME>
</DIRECT>
<DIRECT>
<COMMUNICATION_TYPE> PAGETELL </COMMUNICATION_TYPE>
<Invoc_serial> 29 </Invoc_serial>
<Serial> 19461912 </Serial>
<USAGE> TELL </USAGE>
<MESSAGE_TYPE> EMOTE </MESSAGE_TYPE>
<CHARACTER_ID> 10010 </CHARACTER_ID>
<CHARACTER_STATUS> 6 </CHARACTER_STATUS>
<LOCATION_ID> 24488 </LOCATION_ID>
<TARGET_CHARACTER_ID> 16783 </TARGET_CHARACTER_ID>
<TARGET_CHARACTER_STATUS> 5 </TARGET_CHARACTER_STATUS>
<TARGET_CHARACTER_LOCATION_ID> 39784
</TARGET_CHARACTER_LOCATION_ID>
<MESSAGE> %#NF#%wthinks %y%l. o O ( %w%lThinks of a new
prefix/suffix.%y%l ) </MESSAGE>
<TIME> 'Tue, 01 Jan 2002 20:27:50 +0000' </TIME>
</DIRECT>
<DIRECT>
<COMMUNICATION_TYPE> PAGETELL </COMMUNICATION_TYPE>
<Invoc_serial> 29 </Invoc_serial>
<Serial> 19461913 </Serial>
<USAGE> TELL </USAGE>
<MESSAGE_TYPE> EMOTE </MESSAGE_TYPE>
<CHARACTER_ID> 10010 </CHARACTER_ID>
<CHARACTER_STATUS> 6 </CHARACTER_STATUS>
<LOCATION_ID> 24488 </LOCATION_ID>
<TARGET_CHARACTER_ID> 35257 </TARGET_CHARACTER_ID>
<TARGET_CHARACTER_STATUS> 4 </TARGET_CHARACTER_STATUS>
<TARGET_CHARACTER_LOCATION_ID> 293 </TARGET_CHARACTER_LOCATION_ID>
<MESSAGE> %#NF#%wthinks %y%l. o O ( %w%lThinks of a new
prefix/suffix.%y%l ) </MESSAGE>
<TIME> 'Tue, 01 Jan 2002 20:27:50 +0000' </TIME>
</DIRECT>
<DIRECT>
<COMMUNICATION_TYPE> PAGETELL </COMMUNICATION_TYPE>
<Invoc_serial> 29 </Invoc_serial>
<Serial> 19461994 </Serial>
<USAGE> TELL </USAGE>
<MESSAGE_TYPE> STD </MESSAGE_TYPE>
<CHARACTER_ID> 20241 </CHARACTER_ID>
<CHARACTER_STATUS> 3 </CHARACTER_STATUS>
<LOCATION_ID> 31132 </LOCATION_ID>
<TARGET_CHARACTER_ID> 14211 </TARGET_CHARACTER_ID>
<TARGET_CHARACTER_STATUS> 5 </TARGET_CHARACTER_STATUS>
<TARGET_CHARACTER_LOCATION_ID> 3726
</TARGET_CHARACTER_LOCATION_ID>
<MESSAGE> "lol I found my own ways to amuse myself tho...like when
liv tyler went 'ive got to take him to my father' im like yayaay were
going to se steve tylerrrrr!!! " </MESSAGE>
<TIME> 'Tue, 01 Jan 2002 20:28:08 +0000' </TIME>
</DIRECT>
<DIRECT>
<COMMUNICATION_TYPE> PAGETELL </COMMUNICATION_TYPE>
<Invoc_serial> 29 </Invoc_serial>
<Serial> 19461995 </Serial>
<USAGE> TELL </USAGE>
<MESSAGE_TYPE> STD </MESSAGE_TYPE>
<CHARACTER_ID> 20241 </CHARACTER_ID>
<CHARACTER_STATUS> 3 </CHARACTER_STATUS>
<LOCATION_ID> 31132 </LOCATION_ID>
<TARGET_CHARACTER_ID> 12969 </TARGET_CHARACTER_ID>
<TARGET_CHARACTER_STATUS> 3 </TARGET_CHARACTER_STATUS>
<TARGET_CHARACTER_LOCATION_ID> 111 </TARGET_CHARACTER_LOCATION_ID>
<MESSAGE> "lol I found my own ways to amuse myself tho...like when
liv tyler went 'ive got to take him to my father' im like yayaay were
going to se steve tylerrrrr!!! " </MESSAGE>
<TIME> 'Tue, 01 Jan 2002 20:28:08 +0000' </TIME>
</DIRECT>
</LOG>
Sample output( from much bigger file - just to show duplicates)
Room 24488 :
10010
Room 31132 :
20241
Room 10433 :
18735
Room 39784 :
16783
27087
27087
27087
16783
16783
16783
16783
16783
16783
16783
16783
16783
16783
16783
16783
16783
16783
Room 293 :
35257
35257
35257
18735
23212
18735
23212
43442
44860
18908
20946
20946
18908
20946
18908
20946
20946
18908
20946
20946
18908
20946
18908
etc etc
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list