[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

[xsl] Re: Sorting by days of the week


Subject: [xsl] Re: Sorting by days of the week
From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx>
Date: Tue, 23 Dec 2003 10:49:32 +0100

<allan.mccluskey@xxxxxxxxxxxxxxxxx> wrote in message
news:OF81B59B27.47321731-ONCA256E05.000EB718-CA256E05.000F8237@xxxxxxxxxxxxxxxxxxxx
> G'day all,
>
> I need to sort my output by days of the week. i.e. I have a element called
> 'dayCode' which can contain one of the following values: MON1, MON2, TUE1,
> TUE2, WED1, WED2, THU1, THU2, FRI1, FRI2 etc etc
>
> I've tried using <xsl:sort select="dayCode" order="ascending"/> but as you
> would expect, the output order is FRI, MON, THU, TUE, WED.
>
> Is there a way to do this kind or sort??

A general type of solution is the following:

This transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:wkDays="my:week Days"
 exclude-result-prefixes="wkDays"
 >
  <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <wkDays:wkDays>
    <wDay name="MON1" ordinal="1"/>
    <wDay name="MON2" ordinal="2"/>
    <wDay name="TUE1" ordinal="3"/>
    <wDay name="TUE2" ordinal="4"/>
    <wDay name="WED1" ordinal="5"/>
    <wDay name="WED2" ordinal="6"/>
    <wDay name="THU1" ordinal="7"/>
    <wDay name="THU2" ordinal="8"/>
    <wDay name="FRI1" ordinal="9"/>
    <wDay name="FRI2" ordinal="10"/>
    <wDay name="SAT1" ordinal="11"/>
    <wDay name="SAT2" ordinal="12"/>
    <wDay name="SUN1" ordinal="13"/>
    <wDay name="SUN2" ordinal="14"/>
  </wkDays:wkDays>

  <xsl:variable name="vwkDays" select="document('')/*/wkDays:*[1]"/>
  <xsl:template match="days">
    <days>
      <xsl:for-each select="day">
        <xsl:sort select="$vwkDays/wDay[@name=current()]/@ordinal"
         data-type="number"/>

         <xsl:copy-of select="."/>
      </xsl:for-each>
    </days>
  </xsl:template>
</xsl:stylesheet>

when applied on this source.xml:

<days>
  <day>FRI2</day>
  <day>TUE1</day>
  <day>MON1</day>
  <day>THU2</day>
  <day>WED1</day>
  <day>SUN2</day>
  <day>SAT1</day>
</days>

produces the wanted result:

<days>
   <day>MON1</day>
   <day>TUE1</day>
   <day>WED1</day>
   <day>THU2</day>
   <day>FRI2</day>
   <day>SAT1</day>
   <day>SUN2</day>
</days>



Dimitre Novatchev.
FXSL developer

http://fxsl.sourceforge.net/ -- the home of FXSL
Resume: http://fxsl.sf.net/DNovatchev/Resume/Res.html




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



Current Thread