[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

Subject: RE: what's the best way to do this
From: Roelof Wobben <rwobben@xxxxxxxxxxx>
Date: Thu, 5 Jan 2012 11:20:18 +0000
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) &lt;= 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 &lt; 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

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.