[xsl] cross-reference & xsl:sort - MSXML3 vs MSXML4

Subject: [xsl] cross-reference & xsl:sort - MSXML3 vs MSXML4
From: David Chryst <dchryst@xxxxxxxxx>
Date: Mon, 15 Apr 2002 15:44:15 -0700 (PDT)
I want to pass in a collection/@name and get a list of
all the corresponding part elements (cross refence). 
Then I want to sort the data first by part/@type, then
by part/@name.  I lifted the sample xml from a similar
note posted to this list in October 2001.  That email
is duplicated at the bootom.  I never did see that
problem answered.

First, I added a little more sample data (groupC) to
the xml:


<large-collection>
	<part id="1" type="type-a" name="name-a"/>
	<part id="2" type="type-a" name="name-b"/>
	<part id="3" type="type-b" name="name-c"/>
	<part id="4" type="type-d" name="name-d"/>
	<part id="5" type="type-b" name="name-e"/>
	<part id="6" type="type-c" name="name-f"/>
	<part id="7" type="type-d" name="name-g"/>
	<part id="8" type="type-b" name="name-h"/>
	<part id="9" type="type-c" name="name-i"/>
	...
	<collection name = "groupA">
		<ref refid="1"/>
		<ref refid="3"/>
	</collection>
	<collection name = "groupB">
		<ref refid="3"/>
		<ref refid="4"/>
	</collection>
	<collection name = "groupC">
		<ref refid="1"/>
		<ref refid="2"/>
		<ref refid="3"/>
		<ref refid="4"/>
		<ref refid="5"/>
		<ref refid="6"/>
		<ref refid="7"/>
		<ref refid="8"/>
		<ref refid="9"/>
	</collection>
</large-collection>


here's my XSL:


<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
	<xsl:output method="html" />
	<xsl:variable name="MyGroup">groupC</xsl:variable>

	<xsl:template match="/large-collection/collection">
		<xsl:if test="./@name=$MyGroup">
			<xsl:for-each select="ref">
				<xsl:sort select="/large-collection/part[@id =
(current())/@refid]/@type" order="ascending"/>
				<xsl:sort select="/large-collection/part[@id =
(current())/@refid]/@name" order="ascending"/>
				type: <xsl:value-of
select="concat(/large-collection/part[@id =
(current())/@refid]/@type, '  name: ',
/large-collection/part[@id =
(current())/@refid]/@name, '  id: ',
/large-collection/part[@id =
(current())/@refid]/@id)"/>
			</xsl:for-each>
		</xsl:if>
	</xsl:template>

</xsl:stylesheet>


I ran this XSLT script using MSXML3 DOM and Processor
and got this output:


type: type-a  name: name-a  id: 1
type: type-a  name: name-b  id: 2
type: type-b  name: name-c  id: 3
type: type-b  name: name-e  id: 5
type: type-b  name: name-h  id: 8
type: type-c  name: name-f  id: 6
type: type-c  name: name-i  id: 9
type: type-d  name: name-d  id: 4
type: type-d  name: name-g  id: 7


Note the output is sorted correctly (By type, then by
name).  Now look at the output I get running that same
script using MSXML4:


type: type-a  name: name-a  id: 1
type: type-a  name: name-b  id: 2
type: type-b  name: name-c  id: 3
type: type-d  name: name-d  id: 4
type: type-b  name: name-e  id: 5
type: type-c  name: name-f  id: 6
type: type-d  name: name-g  id: 7
type: type-b  name: name-h  id: 8
type: type-c  name: name-i  id: 9


This data is in document order!  What gives?

David

>Hi, following is an example of an xml structure that
I
>require grouped through the use of cross references
>based on a parameterised filter value. The xml
>structure is fairly large so the use of keys to
lookup
>the 'part' element is highly desirable.
>I am currently using xsl:param to define a filter
>value for 'collection@name' having got that I need to
>return a result set that for all the 'parts' referred
>to by 'ref@refid' references in the 'collection'
>grouped by 'part@type', sorted with in each group by
>'part@name'. It would also be desirable to have the
>result set assigned to an xsl:variable.

<large-collection>
	<part id="1" type="type-a" name="name-a"/>
	<part id="2" type="type-a" name="name-b"/>
	<part id="3" type="type-b" name="name-c"/>
	<part id="4" type="type-d" name="name-d"/>
	<part id="5" type="type-b" name="name-e"/>
	<part id="6" type="type-c" name="name-f"/>
	<part id="7" type="type-d" name="name-g"/>
	<part id="8" type="type-b" name="name-h"/>
	<part id="9" type="type-c" name="name-i"/>
	...
	<collection name = "groupA">
		<ref refid="1"/>
		<ref refid="3"/>
	</collection>
	<collection name = "groupB">
		<ref refid="3"/>
		<ref refid="4"/>
	</collection>
</large-collection>


>Cheers 
>Tom Hall


__________________________________________________
Do You Yahoo!?
Yahoo! Tax Center - online filing with TurboTax
http://taxes.yahoo.com/

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread