> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of
> Peter Billen
> Sent: 12 February 2004 22:32
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: 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
|