Re: [xsl] Newbie question on XSL transformations: multiple sorts on element attributes

Subject: Re: [xsl] Newbie question on XSL transformations: multiple sorts on element attributes
From: Rob Newman <rlnewman@xxxxxxxx>
Date: Tue, 6 Feb 2007 13:19:25 -0800
Abel and others,

Thanks so much for the prompt response and help! I really appreciate it.
You are correct that my syntax was incorrect. Unfortunately the solution you gave me also seg faults.
The XSLT processor I am using is xsltproc (from the command line). It does not give me any useful error output aside from "Segmentation fault'. Would you recommend using a different processor?


{hostname} 273%> xsltproc -v -o output.xml transform.xsl input.xml
creating dictionary for stylesheet
reusing dictionary from transform.xsl for stylesheet
Added namespace: xsl mapped to http://www.w3.org/1999/XSL/Transform
Segmentation fault
{hostname} 274%>

-- START SNIPPET --
<xsl:template match="dataloggerlist">
<xsl:element name="dataloggerlist">
<xsl:apply-templates select="datalogger">
<xsl:sort select="param/@id{dlt}" data-type="number" order="descending" />
<xsl:sort select="@name" order="ascending" />
</xsl:apply-templates>
</xsl:element>
</xsl:template>
-- END SNIPPET --
(Note: the datalogger template outputs the data same as before)

This is very strange, as it cannot possibly run, you have a syntax error in your select clause (if you did manage to get it running, can you follow-up with the processor you are using?). The following is in error:


<xsl:sort select="param/@id{dlt}" data-type="number" order="descending" />

Change it to:

<xsl:sort select="param[@id = 'dlt']" />

and all elements with @id = 'dlt' (i.e., attribute nodes containing the exact match to the text 'dlt') will be output firstly.

Here is the relevant part of the file (changed as per your instruction):


-- START SNIPPET --
<xsl:template match="dataloggerlist">
	<xsl:element name="dataloggerlist">
		<xsl:apply-templates select="datalogger">
			<xsl:sort select="param[@id = 'dlt']" />
		</xsl:apply-templates>
	</xsl:element>
</xsl:template>
-- END SNIPPET --

I would prefer to do this whole process in one step, and avoid having two XSL files that create an interim XML file that just gets transformed again.

and you are right, you won't need to.

Can you please give me an example of how to do this in one file? As I see it, I have to get the XML structure tight with my first transformation before I can apply the sorting rules. In the meantime I will keep tinkering.....


Thanks again,
- Rob

Current Thread