From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of
Peter Billen
Sent: 12 February 2004 22:32
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] alternative for modes
Oki I think it's time for an example :) Imagine:
<streetrace>
<car>
<owner>...</owner>
...
</car>
<car>
<owner>...</owner>
...
</car>
...
</streetrace>
Now imagine you want to print out all the cars of the
streetrace: first all in red, then in blue, sorted by the
owner of the car(in my example of course, everything is a bit
more complicated, especially the sorting code). The best I
came up with, is the following:
<xsl:template match="streetrace>
<!-- print cars in blue !-->
<xsl:call-template name="giveCarsSorted">
<xsl:with-param name="mode" select="'blue'"/>
</xsl:call-template>
<!-- in red !-->
<xsl:call-template name="giveCarsSorted">
<xsl:with-param name="mode" select="'red'"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="giveCarsSorted">
<xsl:param name="mode"/>
<xsl:apply-templates> // this will go to each <car>-element
<xsl:sort select="car/owner"/> // sort on
<owner> in <car>
<xsl:with-param name="mode" select="$mode"/> //
propagate $mode
</xsl:apply-templates>
</xsl:template>
<xsl:template match="car">
<xsl:param name="mode"/>
<xsl:if test="$mode = 'blue'">
<font color="blue"><xsl:value-of
select="."/></font><br/>
</xsl:if>
<xsl:if test="$mode = 'red'">
<font color="red"><xsl:value-of select="."/></font><br/>
</xsl:if>
</xsl:template>
I hope I didn't make any big mistakes, since I haven't tested
it myself.
Why are you mixing the sorting and the fact that you want blue or red ?
There are many ways of solving this problem w/o modes, perhaps you could
use a top level nested xsl:variable to sort the data first
<xsl:variable name="data-sorted-by-owner">
<xsl:apply-templates select="//car">
<xsl:sort select="car/owner"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:variable name="data-sorted-by-car">
<xsl:apply-templates select="//car">
<xsl:sort select="car"/>
</xsl:apply-templates>
</xsl:variable>
Then refer to $data-sorted-by-car or $data-sorted-by-owner.
Use a simple match template for this and create multiple variables for
whatever sorting your want...then use a named template for the color. At
worst this solution may require you to use processor specific node-set
function.
Gl, jim fuller
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list