[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] RE: what's the best way to do this
Oke, So I have to do this : <xsl: template match="menu"> <div id="firstpane" class="menu_list"> <xsl:apply-templates select="year"> </div> </xsl:template> <xsl:template match="year"> <p class="menu_head">@value</p> <div class="menu_body"> <xsl:apply-templates select="month"> </div> </xsl:template> <xsl:template match="month"> <a href=""#"> februari </a> </xsl:template> For the converting I use this file : <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- Description: This is a date formatting utility. The named template "format-date" takes 2 parameters: 1. date - [required] takes an ISO date (2005-12-01) 2. format - [optional] takes a format string. Format options: Y - year in 4 digits e.g. 1981, 1992, 2008 y - year in 2 digits e.g. 81, 92, 08 M - month as a full word e.g. January, March, September m - month in 3 letters e.g. Jan, Mar, Sep N - month in digits without leading zero n - month in digits with leading zero D - day with suffix and no leading zero e.g. 1st, 23rd d - day in digits with leading zero e.g. 01, 09, 12, 25 x - day in digits with no leading zero e.g. 1, 9, 12, 25 T - time in 24-hours e.g. 18:30 t - time in 12-hours e.g. 6:30pm W - weekday as a full word e.g. Monday, Tuesday w - weekday in 3 letters e.g. Mon, Tue, Wed Examples: M => January d M => 21 September m D, y => Sep 21st, 81 n-d-y => 09-21-81 d/n/y => 21/09/81 d/n/y t => 21/09/81 6:30pm --> <xsl:template name="format-date"> <xsl:param name="date"/> <xsl:param name="format" select="'D M, Y'"/> <xsl:choose> <xsl:when test="string-length($format) <= 10"> <xsl:call-template name="date-controller"> <xsl:with-param name="date" select="$date"/> <xsl:with-param name="format" select="$format"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:text>Error: format parameter is not correctly set. You have: </xsl:text> <xsl:value-of select="string-length($format)"/> <xsl:text>.</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="date-controller"> <xsl:param name="date"/> <xsl:param name="format"/> <xsl:param name="letter" select="substring($format,1,1)"/> <xsl:param name="tletter" select="translate($letter,'DMNYTW','dmnytw')"/> <xsl:choose> <xsl:when test="$tletter = 'y'"> <xsl:call-template name="format-year"> <xsl:with-param name="date" select="$date"/> <xsl:with-param name="format" select="$letter"/> </xsl:call-template> </xsl:when> <xsl:when test="$tletter = 'm'"> <xsl:call-template name="format-month"> <xsl:with-param name="date" select="$date"/> <xsl:with-param name="format" select="$letter"/> </xsl:call-template> </xsl:when> <xsl:when test="$tletter = 'n'"> <xsl:call-template name="format-month"> <xsl:with-param name="date" select="$date"/> <xsl:with-param name="format" select="$letter"/> </xsl:call-template> </xsl:when> <xsl:when test="$tletter = 'd'"> <xsl:call-template name="format-day"> <xsl:with-param name="date" select="$date"/> <xsl:with-param name="format" select="$letter"/> </xsl:call-template> </xsl:when> <xsl:when test="$tletter = 'x'"> <xsl:call-template name="format-day"> <xsl:with-param name="date" select="$date"/> <xsl:with-param name="format" select="$letter"/> </xsl:call-template> </xsl:when> <xsl:when test="$tletter = 't'"> <xsl:call-template name="format-time"> <xsl:with-param name="time" select="$date/@time"/> <xsl:with-param name="format" select="$letter"/> </xsl:call-template> </xsl:when> <xsl:when test="$tletter = 'w'"> <xsl:call-template name="format-weekday"> <xsl:with-param name="weekday" select="$date/@weekday"/> <xsl:with-param name="format" select="$letter"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$letter"/> </xsl:otherwise> </xsl:choose> <xsl:if test="$letter = not('')"> <xsl:call-template name="date-controller"> <xsl:with-param name="date" select="$date"/> <xsl:with-param name="format" select="substring($format,2)"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="format-year"> <xsl:param name="date"/> <xsl:param name="year" select="substring($date,1,4)"/> <xsl:param name="format" select="'y'"/> <xsl:choose> <xsl:when test="$format = 'y'"> <xsl:value-of select="substring($year,3)"/> </xsl:when> <xsl:when test="$format = 'Y'"> <xsl:value-of select="$year"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="format-month"> <xsl:param name="date"/> <xsl:param name="month" select="format-number(substring($date,6,2), '##')"/> <xsl:param name="format" select="'m'"/> <xsl:param name="month-word"> <xsl:choose> <xsl:when test="$month = 01">January</xsl:when> <xsl:when test="$month = 02">February</xsl:when> <xsl:when test="$month = 03">March</xsl:when> <xsl:when test="$month = 04">April</xsl:when> <xsl:when test="$month = 05">May</xsl:when> <xsl:when test="$month = 06">June</xsl:when> <xsl:when test="$month = 07">July</xsl:when> <xsl:when test="$month = 08">August</xsl:when> <xsl:when test="$month = 09">September</xsl:when> <xsl:when test="$month = 10">October</xsl:when> <xsl:when test="$month = 11">November</xsl:when> <xsl:when test="$month = 12">December</xsl:when> </xsl:choose> </xsl:param> <xsl:choose> <xsl:when test="$format = 'm'"> <xsl:value-of select="substring($month-word, 1,3)"/> </xsl:when> <xsl:when test="$format = 'M'"> <xsl:value-of select="$month-word"/> </xsl:when> <xsl:when test="$format = 'n'"> <xsl:value-of select="format-number($month, '00')"/> </xsl:when> <xsl:when test="$format = 'N'"> <xsl:value-of select="format-number($month, '0')"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="format-day"> <xsl:param name="date"/> <xsl:param name="day" select="format-number(substring($date,9,2),'00')"/> <xsl:param name="format" select="'d'"/> <xsl:param name="suffix"> <xsl:choose> <xsl:when test="(substring($day,2) = 1) and not(substring($day,1,1) = 1)">st</xsl:when> <xsl:when test="(substring($day,2) = 2) and not(substring($day,1,1) = 1)">nd</xsl:when> <xsl:when test="(substring($day,2) = 3) and not(substring($day,1,1) = 1)">rd</xsl:when> <xsl:otherwise>th</xsl:otherwise> </xsl:choose> </xsl:param> <xsl:choose> <xsl:when test="$format = 'd'"> <xsl:value-of select="$day"/> </xsl:when> <xsl:when test="$format = 'x'"> <xsl:value-of select="format-number($day,'0')"/> </xsl:when> <xsl:when test="$format = 'D'"> <xsl:value-of select="format-number($day,'0')"/> <xsl:value-of select="$suffix"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="format-time"> <xsl:param name="time"/> <xsl:param name="hour" select="substring-before($time, ':')"/> <xsl:param name="minute" select="substring-after($time, ':')"/> <xsl:param name="format" select="'T'"/> <xsl:choose> <xsl:when test="$format = 'T'"> <xsl:value-of select="$time"/> </xsl:when> <xsl:when test="$format = 't'"> <xsl:choose> <xsl:when test="$hour mod 12 = 0">12</xsl:when> <xsl:otherwise><xsl:value-of select="($hour mod 12)"/></xsl:otherwise> </xsl:choose> <xsl:value-of select="concat(':',$minute)"/> <xsl:choose> <xsl:when test="$hour < 12">am</xsl:when> <xsl:otherwise>pm</xsl:otherwise> </xsl:choose> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="format-weekday"> <xsl:param name="weekday"/> <xsl:param name="format" select="'w'"/> <xsl:param name="result"> <xsl:choose> <xsl:when test="$weekday = 1">Monday</xsl:when> <xsl:when test="$weekday = 2">Tuesday</xsl:when> <xsl:when test="$weekday = 3">Wednesday</xsl:when> <xsl:when test="$weekday = 4">Thursday</xsl:when> <xsl:when test="$weekday = 5">Friday</xsl:when> <xsl:when test="$weekday = 6">Saturday</xsl:when> <xsl:when test="$weekday = 7">Sunday</xsl:when> </xsl:choose> </xsl:param> <xsl:choose> <xsl:when test="$format = 'W'"> <xsl:value-of select="$result"/> </xsl:when> <xsl:when test="$format = 'w'"> <xsl:value-of select="substring($result,1,3)"/> </xsl:when> </xsl:choose> </xsl:template> </xsl:stylesheet> I found this one with the cms I use. Roelof > Date: Thu, 5 Jan 2012 12:00:12 +0100 > From: matthieu.ricaud@xxxxxxxxx > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: Re: what's the best way to do this > > Hi Roelof, > > This time, I'm not late ! > > I don't see any difficulty to get the HTML ouput, it's just in the same > order than the XML. I would actually > - match the root "menu" element to make the html, head and body elements, > - then match "section" to make the "div id=firstpane" (be carefull with > id unicity if the xml contains many sections) and his skeleton i.e > "menu_head" and "menu_body" > - then match "year" to fullfill menu_head > - then "month" to construct the links > - and ignoring entry > > > But maybe the problem is about converting numerical month values to > litterals ones ? > > To do this, you have to write somewhere the correspondance "numeric - > litteral". > > You have 2 options : > - either in an external xml file (i think this kind of file is call > "authority list") > => then reading the file from your XSL (using document() function, > or aggregate it before with xproc/cocoon... many solutions here) > - or within your XSLT : > - with a test (choose/when/otherwise..) but this is not handy to > maintain > - with variable > - type nodeset if XSLT1 > - containing a sequence (XSLT2) > > Hope this help, > > Matthieu > > > > Le 05/01/2012 11:33, Roelof Wobben a icrit : > > > > Hello, > > > > > > > > Last question and then I have the site ready. > > > > > > > > I have now this xml : > > > > > > > > <menu> > > > > <section id="9" handle="dagboek">Dagboek</section> > > > > <year value="2005"> > > > > <month value="03"> > > > > <entry id="17" /> > > > > </month> > > > > <month value="02"> > > > > <entry id="16" /> > > > > <entry id="15" /> > > > > <entry id="14" /> > > > > </month> > > > > </year> > > > > </menu> > > > > > > > > And I like to have this output : > > > > > > > > <div id="firstpane" class="menu_list"> > > > > <p class="menu_head">2005</p> > > > > <div class="menu_body"> > > > > <a href="#">februari</a> > > > > <a href="#">maart</a> > > > > </div> > > > > </div> > > > > > > > > And I wonder now what's the best approach to get all the months under the year ? > > > > > > > > Regards, > > > > > > > > Roelof > > > > > > > -- > Matthieu Ricaud > 05 45 37 08 90 > NeoLibris
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|