]> git.stg.codes - stg.git/blob - doc/xslt/slides/keynote/xsltsl/date-time.xsl
Fixed stupid bug in case conversion functions.
[stg.git] / doc / xslt / slides / keynote / xsltsl / date-time.xsl
1 <?xml version="1.0"?>
2 <xsl:stylesheet version="1.0"
3   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4   xmlns:doc="http://xsltsl.org/xsl/documentation/1.0"
5   xmlns:dt="http://xsltsl.org/date-time"
6   xmlns:str="http://xsltsl.org/string"
7   extension-element-prefixes="doc str">
8
9   <doc:reference xmlns="">
10     <referenceinfo>
11       <releaseinfo role="meta">
12         $Id: date-time.xsl 3991 2004-11-10 06:51:55Z balls $
13       </releaseinfo>
14       <author>
15         <surname>Diamond</surname>
16         <firstname>Jason</firstname>
17       </author>
18       <copyright>
19         <year>2004</year>
20         <holder>Steve Ball</holder>
21       </copyright>
22       <copyright>
23         <year>2001</year>
24         <holder>Jason Diamond</holder>
25       </copyright>
26     </referenceinfo>
27
28     <title>Date/Time Processing</title>
29
30     <partintro>
31       <section>
32         <title>Introduction</title>
33
34         <para>This module provides templates for formatting and parsing date/time strings.</para>
35
36         <para>See <ulink url="http://www.tondering.dk/claus/calendar.html">http://www.tondering.dk/claus/calendar.html</ulink> for more information on calendars and the calculations this library performs.</para>
37
38       </section>
39     </partintro>
40
41   </doc:reference>
42
43   <doc:template name="dt:format-date-time" xmlns="">
44     <refpurpose>Returns a string with a formatted date/time.</refpurpose>
45
46     <refdescription>
47       <para>The formatted date/time is determined by the format parameter. The default format is %Y-%m-%dT%H:%M:%S%z, the W3C format.</para>
48     </refdescription>
49
50     <refparameter>
51       <variablelist>
52
53         <varlistentry>
54           <term>xsd-date-time</term>
55           <listitem>
56             <para>The date-time value in XML Schemas (WXS) format.</para>
57             <para>If this value is specified, it takes priority over other parameters.</para>
58           </listitem>
59         </varlistentry>
60
61         <varlistentry>
62           <term>year</term>
63           <listitem>
64             <para>Year, in either 2 or 4+ digit format..</para>
65             <para>If the year is given as a two digit value, it will be converted to a four digit value using the fixed window method.  Values between 00 and 49 will be prepended by "20".  Values between 50 and 99 will be prepended by "19".</para>
66           </listitem>
67         </varlistentry>
68
69         <varlistentry>
70           <term>month</term>
71           <listitem>
72             <para>Month (1 - 12; January = 1)</para>
73           </listitem>
74         </varlistentry>
75
76         <varlistentry>
77           <term>day</term>
78           <listitem>
79             <para>Day of month (1 - 31)</para>
80           </listitem>
81         </varlistentry>
82
83         <varlistentry>
84           <term>hour</term>
85           <listitem>
86             <para>Hours since midnight (0 - 23)</para>
87           </listitem>
88         </varlistentry>
89
90         <varlistentry>
91           <term>minute</term>
92           <listitem>
93             <para>Minutes after hour (0 - 59)</para>
94           </listitem>
95         </varlistentry>
96
97         <varlistentry>
98           <term>second</term>
99           <listitem>
100             <para>Seconds after minute (0 - 59)</para>
101           </listitem>
102         </varlistentry>
103
104         <varlistentry>
105           <term>time-zone</term>
106           <listitem>
107             <para>Time zone string (e.g., 'Z' or '-08:00')</para>
108           </listitem>
109         </varlistentry>
110
111         <varlistentry>
112           <term>format</term>
113           <listitem>
114             <para>The format specification.</para>
115             <variablelist>
116
117               <varlistentry>
118                 <term>%a</term>
119                 <listitem>
120                   <para>Abbreviated weekday name</para>
121                 </listitem>
122               </varlistentry>
123
124               <varlistentry>
125                 <term>%A</term>
126                 <listitem>
127                   <para>Full weekday name</para>
128                 </listitem>
129               </varlistentry>
130
131               <varlistentry>
132                 <term>%b</term>
133                 <listitem>
134                   <para>Abbreviated month name</para>
135                 </listitem>
136               </varlistentry>
137
138               <varlistentry>
139                 <term>%B</term>
140                 <listitem>
141                   <para>Full month name</para>
142                 </listitem>
143               </varlistentry>
144
145               <varlistentry>
146                 <term>%c</term>
147                 <listitem>
148                   <para>Date and time representation appropriate for locale</para>
149                 </listitem>
150               </varlistentry>
151
152               <varlistentry>
153                 <term>%d</term>
154                 <listitem>
155                   <para>Day of month as decimal number (01 - 31)</para>
156                 </listitem>
157               </varlistentry>
158
159               <varlistentry>
160                 <term>%e</term>
161                 <listitem>
162                   <para>Day of month as decimal number (1 - 31)</para>
163                 </listitem>
164               </varlistentry>
165
166               <varlistentry>
167                 <term>%H</term>
168                 <listitem>
169                   <para>Hour in 24-hour format (00 - 23)</para>
170                 </listitem>
171               </varlistentry>
172
173               <varlistentry>
174                 <term>%I</term>
175                 <listitem>
176                   <para>Hour in 12-hour format (01 - 12)</para>
177                 </listitem>
178               </varlistentry>
179
180               <varlistentry>
181                 <term>%i</term>
182                 <listitem>
183                   <para>Hour in 12-hour format (1 - 12)</para>
184                 </listitem>
185               </varlistentry>
186
187               <varlistentry>
188                 <term>%j</term>
189                 <listitem>
190                   <para>Day of year as decimal number (001 - 366)</para>
191                 </listitem>
192               </varlistentry>
193
194               <varlistentry>
195                 <term>%m</term>
196                 <listitem>
197                   <para>Month as decimal number (01 - 12)</para>
198                 </listitem>
199               </varlistentry>
200
201               <varlistentry>
202                 <term>%n</term>
203                 <listitem>
204                   <para>Month as decimal number (1 - 12)</para>
205                 </listitem>
206               </varlistentry>
207
208               <varlistentry>
209                 <term>%M</term>
210                 <listitem>
211                   <para>Minute as decimal number (00 - 59)</para>
212                 </listitem>
213               </varlistentry>
214
215               <varlistentry>
216                 <term>%P</term>
217                 <listitem>
218                   <para>Current locale's A.M./P.M. indicator for 12-hour clock, uppercase</para>
219                 </listitem>
220               </varlistentry>
221
222               <varlistentry>
223                 <term>%Q</term>
224                 <listitem>
225                   <para>Current locale's A.M./P.M. indicator for 12-hour clock, uppercase with periods</para>
226                 </listitem>
227               </varlistentry>
228
229               <varlistentry>
230                 <term>%p</term>
231                 <listitem>
232                   <para>Current locale's A.M./P.M. indicator for 12-hour clock, lowercase</para>
233                 </listitem>
234               </varlistentry>
235
236               <varlistentry>
237                 <term>%q</term>
238                 <listitem>
239                   <para>Current locale's A.M./P.M. indicator for 12-hour clock, lowercase with periods</para>
240                 </listitem>
241               </varlistentry>
242
243               <varlistentry>
244                 <term>%S</term>
245                 <listitem>
246                   <para>Second as decimal number (00 - 59)</para>
247                 </listitem>
248               </varlistentry>
249
250               <varlistentry>
251                 <term>%U</term>
252                 <listitem>
253                   <para>Week of year as decimal number, with Sunday as first day of week (00 - 53)</para>
254                 </listitem>
255               </varlistentry>
256
257               <varlistentry>
258                 <term>%w</term>
259                 <listitem>
260                   <para>Weekday as decimal number (0 - 6; Sunday is 0)</para>
261                 </listitem>
262               </varlistentry>
263
264               <varlistentry>
265                 <term>%W</term>
266                 <listitem>
267                   <para>Week of year as decimal number, with Monday as first day of week (00 - 53)</para>
268                 </listitem>
269               </varlistentry>
270
271               <varlistentry>
272                 <term>%x</term>
273                 <listitem>
274                   <para>Date representation for current locale </para>
275                 </listitem>
276               </varlistentry>
277
278               <varlistentry>
279                 <term>%X</term>
280                 <listitem>
281                   <para>Time representation for current locale</para>
282                 </listitem>
283               </varlistentry>
284
285               <varlistentry>
286                 <term>%y</term>
287                 <listitem>
288                   <para>Year without century, as decimal number (00 - 99)</para>
289                 </listitem>
290               </varlistentry>
291
292               <varlistentry>
293                 <term>%Y</term>
294                 <listitem>
295                   <para>Year with century, as decimal number</para>
296                 </listitem>
297               </varlistentry>
298
299               <varlistentry>
300                 <term>%z</term>
301                 <listitem>
302                   <para>Time-zone name or abbreviation; no characters if time zone is unknown</para>
303                 </listitem>
304               </varlistentry>
305
306               <varlistentry>
307                 <term>%%</term>
308                 <listitem>
309                   <para>Percent sign</para>
310                 </listitem>
311               </varlistentry>
312
313             </variablelist>
314           </listitem>
315         </varlistentry>
316
317       </variablelist>
318     </refparameter>
319
320     <refreturn>
321       <para>Returns a formatted date/time string.</para>
322     </refreturn>
323
324   </doc:template>
325
326   <xsl:template name="dt:format-date-time">
327     <xsl:param name='xsd-date-time'/>
328     <xsl:param name="year"/>
329     <xsl:param name="month"/>
330     <xsl:param name="day"/>
331     <xsl:param name="hour"/>
332     <xsl:param name="minute"/>
333     <xsl:param name="second"/>
334     <xsl:param name="time-zone"/>
335     <xsl:param name="format" select="'%Y-%m-%dT%H:%M:%S%z'"/>
336
337     <xsl:value-of select="substring-before($format, '%')"/>
338
339     <xsl:variable name="code" select="substring(substring-after($format, '%'), 1, 1)"/>
340
341     <xsl:choose>
342
343       <xsl:when test='$xsd-date-time'>
344         <xsl:call-template name='dt:format-date-time'>
345           <xsl:with-param name='year'>
346             <xsl:call-template name='dt:get-xsd-datetime-year'>
347               <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
348             </xsl:call-template>
349           </xsl:with-param>
350           <xsl:with-param name='month'>
351             <xsl:call-template name='dt:get-xsd-datetime-month'>
352               <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
353             </xsl:call-template>
354           </xsl:with-param>
355           <xsl:with-param name='day'>
356             <xsl:call-template name='dt:get-xsd-datetime-day'>
357               <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
358             </xsl:call-template>
359           </xsl:with-param>
360           <xsl:with-param name='hour'>
361             <xsl:call-template name='dt:get-xsd-datetime-hour'>
362               <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
363             </xsl:call-template>
364           </xsl:with-param>
365           <xsl:with-param name='minute'>
366             <xsl:call-template name='dt:get-xsd-datetime-minute'>
367               <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
368             </xsl:call-template>
369           </xsl:with-param>
370           <xsl:with-param name='second'>
371             <xsl:call-template name='dt:get-xsd-datetime-second'>
372               <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
373             </xsl:call-template>
374           </xsl:with-param>
375           <xsl:with-param name='time-zone'>
376             <xsl:call-template name='dt:get-xsd-datetime-timezone'>
377               <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
378             </xsl:call-template>
379           </xsl:with-param>
380           <xsl:with-param name='format'>
381             <xsl:choose>
382               <xsl:when test='contains($format, "%")'>
383                 <xsl:text>%</xsl:text>
384                 <xsl:value-of select='substring-after($format, "%")'/>
385               </xsl:when>
386               <xsl:otherwise>
387                 <xsl:value-of select='$format'/>
388               </xsl:otherwise>
389             </xsl:choose>
390           </xsl:with-param>
391         </xsl:call-template>
392       </xsl:when>
393
394       <!-- Abbreviated weekday name -->
395       <xsl:when test="$code='a'">
396         <xsl:variable name="day-of-the-week">
397           <xsl:call-template name="dt:calculate-day-of-the-week">
398             <xsl:with-param name="year" select="$year"/>
399             <xsl:with-param name="month" select="$month"/>
400             <xsl:with-param name="day" select="$day"/>
401           </xsl:call-template>
402         </xsl:variable>
403         <xsl:call-template name="dt:get-day-of-the-week-abbreviation">
404           <xsl:with-param name="day-of-the-week" select="$day-of-the-week"/>
405         </xsl:call-template>
406       </xsl:when>
407
408       <!-- Full weekday name -->
409       <xsl:when test="$code='A'">
410         <xsl:variable name="day-of-the-week">
411           <xsl:call-template name="dt:calculate-day-of-the-week">
412             <xsl:with-param name="year" select="$year"/>
413             <xsl:with-param name="month" select="$month"/>
414             <xsl:with-param name="day" select="$day"/>
415           </xsl:call-template>
416         </xsl:variable>
417         <xsl:call-template name="dt:get-day-of-the-week-name">
418           <xsl:with-param name="day-of-the-week" select="$day-of-the-week"/>
419         </xsl:call-template>
420       </xsl:when>
421
422       <!-- Abbreviated month name -->
423       <xsl:when test="$code='b'">
424         <xsl:call-template name="dt:get-month-abbreviation">
425           <xsl:with-param name="month" select="$month"/>
426         </xsl:call-template>
427       </xsl:when>
428
429       <!-- Full month name -->
430       <xsl:when test="$code='B'">
431         <xsl:call-template name="dt:get-month-name">
432           <xsl:with-param name="month" select="$month"/>
433         </xsl:call-template>
434       </xsl:when>
435
436       <!-- Date and time representation appropriate for locale -->
437       <xsl:when test="$code='c'">
438         <xsl:text>[not implemented]</xsl:text>
439       </xsl:when>
440
441       <!-- Day of month as decimal number (01 - 31) -->
442       <xsl:when test="$code='d'">
443         <xsl:if test="$day &lt; 10">0</xsl:if>
444         <xsl:value-of select="number($day)"/>
445       </xsl:when>
446       <!-- Day of month as decimal number (1 - 31) -->
447       <xsl:when test="$code='e'">
448         <xsl:value-of select="number($day)"/>
449       </xsl:when>
450
451       <!-- Hour in 24-hour format (00 - 23) -->
452       <xsl:when test="$code='H'">
453         <xsl:if test="$hour &lt; 10">0</xsl:if>
454         <xsl:value-of select="number($hour)"/>
455       </xsl:when>
456
457       <!-- Hour in 12-hour format (01 - 12) -->
458       <xsl:when test="$code='I'">
459         <xsl:choose>
460           <xsl:when test="$hour = 0">12</xsl:when>
461           <xsl:when test="$hour &lt; 10">0<xsl:value-of select="$hour - 0"/></xsl:when>
462           <xsl:when test="$hour &lt; 13"><xsl:value-of select="$hour - 0"/></xsl:when>
463           <xsl:when test="$hour &lt; 22">0<xsl:value-of select="$hour - 12"/></xsl:when>
464           <xsl:otherwise><xsl:value-of select="$hour - 12"/></xsl:otherwise>
465         </xsl:choose>
466       </xsl:when>
467       <!-- Hour in 12-hour format (1 - 12) -->
468       <xsl:when test="$code='i'">
469         <xsl:choose>
470           <xsl:when test="$hour = 0">12</xsl:when>
471           <xsl:when test="$hour &lt; 10"><xsl:value-of select="$hour - 0"/></xsl:when>
472           <xsl:when test="$hour &lt; 13"><xsl:value-of select="$hour - 0"/></xsl:when>
473           <xsl:when test="$hour &lt; 22"><xsl:value-of select="$hour - 12"/></xsl:when>
474           <xsl:otherwise><xsl:value-of select="$hour - 12"/></xsl:otherwise>
475         </xsl:choose>
476       </xsl:when>
477
478       <!-- Day of year as decimal number (001 - 366) -->
479       <xsl:when test="$code='j'">
480         <xsl:text>[not implemented]</xsl:text>
481       </xsl:when>
482
483       <!-- Month as decimal number (01 - 12) -->
484       <xsl:when test="$code='m'">
485         <xsl:if test="$month &lt; 10">0</xsl:if>
486         <xsl:value-of select="number($month)"/>
487       </xsl:when>
488       <!-- Month as decimal number (1 - 12) -->
489       <xsl:when test="$code='n'">
490         <xsl:value-of select="number($month)"/>
491       </xsl:when>
492
493       <!-- Minute as decimal number (00 - 59) -->
494       <xsl:when test="$code='M'">
495         <xsl:if test="$minute &lt; 10">0</xsl:if>
496         <xsl:value-of select="number($minute)"/>
497       </xsl:when>
498
499       <!-- Current locale's A.M./P.M. indicator for 12-hour clock -->
500       <xsl:when test="$code='p'">
501         <xsl:choose>
502           <xsl:when test="$hour &lt; 12">am</xsl:when>
503           <xsl:otherwise>pm</xsl:otherwise>
504         </xsl:choose>
505       </xsl:when>
506       <!-- Current locale's A.M./P.M. indicator for 12-hour clock with periods -->
507       <xsl:when test="$code='q'">
508         <xsl:choose>
509           <xsl:when test="$hour &lt; 12">am</xsl:when>
510           <xsl:otherwise>p.m.</xsl:otherwise>
511         </xsl:choose>
512       </xsl:when>
513       <!-- Current locale's A.M./P.M. indicator for 12-hour clock -->
514       <xsl:when test="$code='P'">
515         <xsl:choose>
516           <xsl:when test="$hour &lt; 12">AM</xsl:when>
517           <xsl:otherwise>PM</xsl:otherwise>
518         </xsl:choose>
519       </xsl:when>
520       <!-- Current locale's A.M./P.M. indicator for 12-hour clock with periods -->
521       <xsl:when test="$code='Q'">
522         <xsl:choose>
523           <xsl:when test="$hour &lt; 12">AM</xsl:when>
524           <xsl:otherwise>P.M.</xsl:otherwise>
525         </xsl:choose>
526       </xsl:when>
527
528       <!-- Second as decimal number (00 - 59) -->
529       <xsl:when test="$code='S'">
530         <xsl:if test="$second &lt; 10">0</xsl:if>
531         <xsl:value-of select="number($second)"/>
532       </xsl:when>
533
534       <!-- Week of year as decimal number, with Sunday as first day of week (00 - 53) -->
535       <xsl:when test="$code='U'">
536         <!-- add 1 to day -->
537         <xsl:call-template name="dt:calculate-week-number">
538           <xsl:with-param name="year" select="$year"/>
539           <xsl:with-param name="month" select="$month"/>
540           <xsl:with-param name="day" select="$day + 1"/>
541         </xsl:call-template>
542       </xsl:when>
543
544       <!-- Weekday as decimal number (0 - 6; Sunday is 0) -->
545       <xsl:when test="$code='w'">
546         <xsl:call-template name="dt:calculate-day-of-the-week">
547           <xsl:with-param name="year" select="$year"/>
548           <xsl:with-param name="month" select="$month"/>
549           <xsl:with-param name="day" select="$day"/>
550         </xsl:call-template>
551       </xsl:when>
552
553       <!-- Week of year as decimal number, with Monday as first day of week (00 - 53) -->
554       <xsl:when test="$code='W'">
555         <xsl:call-template name="dt:calculate-week-number">
556           <xsl:with-param name="year" select="$year"/>
557           <xsl:with-param name="month" select="$month"/>
558           <xsl:with-param name="day" select="$day"/>
559         </xsl:call-template>
560       </xsl:when>
561
562       <!-- Date representation for current locale -->
563       <xsl:when test="$code='x'">
564         <xsl:text>[not implemented]</xsl:text>
565       </xsl:when>
566
567       <!-- Time representation for current locale -->
568       <xsl:when test="$code='X'">
569         <xsl:text>[not implemented]</xsl:text>
570       </xsl:when>
571
572       <!-- Year without century, as decimal number (00 - 99) -->
573       <xsl:when test="$code='y'">
574         <xsl:choose>
575           <xsl:when test='not(number($year))'>invalid year value</xsl:when>
576
577           <!-- workaround MSXML bug -->
578           <xsl:when test='number($year) mod 100 = 0'>00</xsl:when>
579
580           <xsl:otherwise>
581             <xsl:number format='01' value='number($year) mod 100'/>
582           </xsl:otherwise>
583         </xsl:choose>
584       </xsl:when>
585
586       <!-- Year with century, as decimal number -->
587       <xsl:when test="$code='Y'">
588         <xsl:choose>
589           <xsl:when test='not(number($year))'>invalid year value</xsl:when>
590           <xsl:when test='string-length($year) = 2'>
591             <xsl:call-template name='dt:format-two-digit-year'>
592               <xsl:with-param name='year' select='$year'/>
593             </xsl:call-template>
594           </xsl:when>
595           <xsl:when test='string-length($year) >= 4'>
596             <xsl:value-of select='$year'/>
597           </xsl:when>
598           <xsl:otherwise>invalid year value</xsl:otherwise>
599         </xsl:choose>
600       </xsl:when>
601
602       <!-- Time-zone name or abbreviation; no characters if time zone is unknown -->
603       <xsl:when test="$code='z'">
604         <xsl:value-of select="$time-zone"/>
605       </xsl:when>
606
607       <!-- Percent sign -->
608       <xsl:when test="$code='%'">
609         <xsl:text>%</xsl:text>
610       </xsl:when>
611
612     </xsl:choose>
613
614     <xsl:variable name="remainder" select="substring(substring-after($format, '%'), 2)"/>
615
616     <xsl:if test="not($xsd-date-time) and $remainder">
617       <xsl:call-template name="dt:format-date-time">
618         <xsl:with-param name="year" select="$year"/>
619         <xsl:with-param name="month" select="$month"/>
620         <xsl:with-param name="day" select="$day"/>
621         <xsl:with-param name="hour" select="$hour"/>
622         <xsl:with-param name="minute" select="$minute"/>
623         <xsl:with-param name="second" select="$second"/>
624         <xsl:with-param name="time-zone" select="$time-zone"/>
625         <xsl:with-param name="format" select="$remainder"/>
626       </xsl:call-template>
627     </xsl:if>
628
629   </xsl:template>
630
631   <doc:template name="dt:calculate-day-of-the-week" xmlns="">
632     <refpurpose>Calculates the day of the week.</refpurpose>
633
634     <refdescription>
635       <para>Given any Gregorian date, this calculates the day of the week.</para>
636     </refdescription>
637
638     <refparameter>
639       <variablelist>
640         <varlistentry>
641           <term>year</term>
642           <listitem>
643             <para>Year</para>
644           </listitem>
645         </varlistentry>
646         <varlistentry>
647           <term>month</term>
648           <listitem>
649             <para>Month (1 - 12; January = 1)</para>
650           </listitem>
651         </varlistentry>
652         <varlistentry>
653           <term>day</term>
654           <listitem>
655             <para>Day of month (1 - 31)</para>
656           </listitem>
657         </varlistentry>
658       </variablelist>
659     </refparameter>
660
661     <refreturn>
662       <para>Returns the day of the week (0 - 6; Sunday = 0).</para>
663     </refreturn>
664
665   </doc:template>
666
667   <xsl:template name="dt:calculate-day-of-the-week">
668     <xsl:param name="year"/>
669     <xsl:param name="month"/>
670     <xsl:param name="day"/>
671
672     <xsl:variable name="a" select="floor((14 - $month) div 12)"/>
673     <xsl:variable name="y" select="$year - $a"/>
674     <xsl:variable name="m" select="$month + 12 * $a - 2"/>
675
676     <xsl:value-of select="($day + $y + floor($y div 4) - floor($y div 100) + floor($y div 400) + floor((31 * $m) div 12)) mod 7"/>
677
678   </xsl:template>
679
680   <doc:template name="dt:calculate-last-day-of-month" xmlns="">
681     <refpurpose>Calculates the number of days for a specified month.</refpurpose>
682
683     <refdescription>
684       <para>Given any Gregorian month, this calculates the last day of the month.</para>
685     </refdescription>
686
687     <refparameter>
688       <variablelist>
689         <varlistentry>
690           <term>year</term>
691           <listitem>
692             <para>Year</para>
693           </listitem>
694         </varlistentry>
695         <varlistentry>
696           <term>month</term>
697           <listitem>
698             <para>Month (1 - 12; January = 1)</para>
699           </listitem>
700         </varlistentry>
701       </variablelist>
702     </refparameter>
703
704     <refreturn>
705       <para>Returns the number of days in given month as a decimal number.</para>
706     </refreturn>
707   </doc:template>
708
709   <xsl:template name="dt:calculate-last-day-of-month">
710     <xsl:param name="year"/>
711     <xsl:param name="month"/>
712
713     <xsl:choose>
714       <xsl:when test="$month = 2">
715         <xsl:choose> 
716           <xsl:when test="($year mod 4) = 0 and (($year mod 400) = 0
717                           or ($year mod 100) != 0)">29</xsl:when>
718           <xsl:otherwise>28</xsl:otherwise>
719         </xsl:choose>
720       </xsl:when>
721       <xsl:when test="$month &lt; 8">
722         <xsl:choose>
723           <xsl:when test="$month mod 2 = 0">30</xsl:when>
724           <xsl:otherwise>31</xsl:otherwise>
725         </xsl:choose>
726       </xsl:when>
727       <xsl:otherwise>
728         <xsl:choose>
729           <xsl:when test="$month mod 2 = 1">30</xsl:when>
730           <xsl:otherwise>31</xsl:otherwise>
731         </xsl:choose>
732       </xsl:otherwise>
733     </xsl:choose>
734   </xsl:template>
735
736   <doc:template name="dt:get-day-of-the-week-name" xmlns="">
737     <refpurpose>Gets the day of the week's full name.</refpurpose>
738
739     <refdescription>
740       <para>Converts a numeric day of the week value into a string representing the day's full name.</para>
741     </refdescription>
742
743     <refparameter>
744       <variablelist>
745         <varlistentry>
746           <term>day-of-the-week</term>
747           <listitem>
748             <para>Day of the week (0 - 6; Sunday = 0)</para>
749           </listitem>
750         </varlistentry>
751       </variablelist>
752     </refparameter>
753
754     <refreturn>
755       <para>Returns a string.</para>
756     </refreturn>
757
758   </doc:template>
759
760   <xsl:template name="dt:get-day-of-the-week-name">
761     <xsl:param name="day-of-the-week"/>
762
763     <xsl:choose>
764       <xsl:when test="$day-of-the-week = 0">Sunday</xsl:when>
765       <xsl:when test="$day-of-the-week = 1">Monday</xsl:when>
766       <xsl:when test="$day-of-the-week = 2">Tuesday</xsl:when>
767       <xsl:when test="$day-of-the-week = 3">Wednesday</xsl:when>
768       <xsl:when test="$day-of-the-week = 4">Thursday</xsl:when>
769       <xsl:when test="$day-of-the-week = 5">Friday</xsl:when>
770       <xsl:when test="$day-of-the-week = 6">Saturday</xsl:when>
771       <xsl:otherwise>error: <xsl:value-of select="$day-of-the-week"/></xsl:otherwise>
772     </xsl:choose>
773
774   </xsl:template>
775
776   <doc:template name="dt:get-day-of-the-week-abbreviation" xmlns="">
777     <refpurpose>Gets the day of the week's abbreviation.</refpurpose>
778
779     <refdescription>
780       <para>Converts a numeric day of the week value into a string representing the day's abbreviation.</para>
781     </refdescription>
782
783     <refparameter>
784       <variablelist>
785         <varlistentry>
786           <term>day-of-the-week</term>
787           <listitem>
788             <para>Day of the week (0 - 6; Sunday = 0)</para>
789           </listitem>
790         </varlistentry>
791       </variablelist>
792     </refparameter>
793
794     <refreturn>
795       <para>Returns a string.</para>
796     </refreturn>
797
798   </doc:template>
799
800   <xsl:template name="dt:get-day-of-the-week-abbreviation">
801     <xsl:param name="day-of-the-week"/>
802
803     <xsl:choose>
804       <xsl:when test="$day-of-the-week = 0">Sun</xsl:when>
805       <xsl:when test="$day-of-the-week = 1">Mon</xsl:when>
806       <xsl:when test="$day-of-the-week = 2">Tue</xsl:when>
807       <xsl:when test="$day-of-the-week = 3">Wed</xsl:when>
808       <xsl:when test="$day-of-the-week = 4">Thu</xsl:when>
809       <xsl:when test="$day-of-the-week = 5">Fri</xsl:when>
810       <xsl:when test="$day-of-the-week = 6">Sat</xsl:when>
811       <xsl:otherwise>error: <xsl:value-of select="$day-of-the-week"/></xsl:otherwise>
812     </xsl:choose>
813
814   </xsl:template>
815
816   <doc:template name="dt:get-month-name" xmlns="">
817     <refpurpose>Gets the month's full name.</refpurpose>
818
819     <refdescription>
820       <para>Converts a numeric month value into a string representing the month's full name.</para>
821     </refdescription>
822
823     <refparameter>
824       <variablelist>
825         <varlistentry>
826           <term>month</term>
827           <listitem>
828             <para>Month (1 - 12; Januaray = 1)</para>
829           </listitem>
830         </varlistentry>
831       </variablelist>
832     </refparameter>
833
834     <refreturn>
835       <para>Returns a string.</para>
836     </refreturn>
837
838   </doc:template>
839
840   <xsl:template name="dt:get-month-name">
841     <xsl:param name="month"/>
842
843     <xsl:choose>
844       <xsl:when test="$month = 1">January</xsl:when>
845       <xsl:when test="$month = 2">February</xsl:when>
846       <xsl:when test="$month = 3">March</xsl:when>
847       <xsl:when test="$month = 4">April</xsl:when>
848       <xsl:when test="$month = 5">May</xsl:when>
849       <xsl:when test="$month = 6">June</xsl:when>
850       <xsl:when test="$month = 7">July</xsl:when>
851       <xsl:when test="$month = 8">August</xsl:when>
852       <xsl:when test="$month = 9">September</xsl:when>
853       <xsl:when test="$month = 10">October</xsl:when>
854       <xsl:when test="$month = 11">November</xsl:when>
855       <xsl:when test="$month = 12">December</xsl:when>
856       <xsl:otherwise>error: <xsl:value-of select="$month"/></xsl:otherwise>
857     </xsl:choose>
858
859   </xsl:template>
860
861   <doc:template name="dt:get-month-abbreviation" xmlns="">
862     <refpurpose>Gets the month's abbreviation.</refpurpose>
863
864     <refdescription>
865       <para>Converts a numeric month value into a string representing the month's abbreviation.</para>
866     </refdescription>
867
868     <refparameter>
869       <variablelist>
870         <varlistentry>
871           <term>month</term>
872           <listitem>
873             <para>Month (1 - 12; Januaray = 1)</para>
874           </listitem>
875         </varlistentry>
876       </variablelist>
877     </refparameter>
878
879     <refreturn>
880       <para>Returns a string.</para>
881     </refreturn>
882
883   </doc:template>
884
885   <xsl:template name="dt:get-month-abbreviation">
886     <xsl:param name="month"/>
887
888     <xsl:choose>
889       <xsl:when test="$month = 1">Jan</xsl:when>
890       <xsl:when test="$month = 2">Feb</xsl:when>
891       <xsl:when test="$month = 3">Mar</xsl:when>
892       <xsl:when test="$month = 4">Apr</xsl:when>
893       <xsl:when test="$month = 5">May</xsl:when>
894       <xsl:when test="$month = 6">Jun</xsl:when>
895       <xsl:when test="$month = 7">Jul</xsl:when>
896       <xsl:when test="$month = 8">Aug</xsl:when>
897       <xsl:when test="$month = 9">Sep</xsl:when>
898       <xsl:when test="$month = 10">Oct</xsl:when>
899       <xsl:when test="$month = 11">Nov</xsl:when>
900       <xsl:when test="$month = 12">Dec</xsl:when>
901       <xsl:otherwise>error: <xsl:value-of select="$month"/></xsl:otherwise>
902     </xsl:choose>
903
904   </xsl:template>
905
906   <doc:template name="dt:calculate-julian-day" xmlns="">
907     <refpurpose>Calculates the Julian Day for a specified date.</refpurpose>
908
909     <refdescription>
910       <para>Given any Gregorian date, this calculates the Julian Day.</para>
911     </refdescription>
912
913     <refparameter>
914       <variablelist>
915         <varlistentry>
916           <term>year</term>
917           <listitem>
918             <para>Year</para>
919           </listitem>
920         </varlistentry>
921         <varlistentry>
922           <term>month</term>
923           <listitem>
924             <para>Month (1 - 12; January = 1)</para>
925           </listitem>
926         </varlistentry>
927         <varlistentry>
928           <term>day</term>
929           <listitem>
930             <para>Day of month (1 - 31)</para>
931           </listitem>
932         </varlistentry>
933       </variablelist>
934     </refparameter>
935
936     <refreturn>
937       <para>Returns the Julian Day as a decimal number.</para>
938     </refreturn>
939
940   </doc:template>
941
942   <xsl:template name="dt:calculate-julian-day">
943     <xsl:param name="year"/>
944     <xsl:param name="month"/>
945     <xsl:param name="day"/>
946
947     <xsl:variable name="a" select="floor((14 - $month) div 12)"/>
948     <xsl:variable name="y" select="$year + 4800 - $a"/>
949     <xsl:variable name="m" select="$month + 12 * $a - 3"/>
950
951     <xsl:value-of select="$day + floor((153 * $m + 2) div 5) + $y * 365 + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045"/>
952
953   </xsl:template>
954
955   <doc:template name="dt:format-julian-day" xmlns="">
956     <refpurpose>Returns a string with a formatted date for a specified Julian Day.</refpurpose>
957
958     <refdescription>
959       <para>Given any Julian Day, this returns a string according to the format specification.</para>
960     </refdescription>
961
962     <refparameter>
963       <variablelist>
964         <varlistentry>
965           <term>julian-day</term>
966           <listitem>
967             <para>A Julian Day</para>
968           </listitem>
969         </varlistentry>
970         <varlistentry>
971           <term>format</term>
972           <listitem>
973             <para>The format specification. See dt:format-date-time for more details.</para>
974           </listitem>
975         </varlistentry>
976       </variablelist>
977     </refparameter>
978
979     <refreturn>
980       <para>A string.</para>
981     </refreturn>
982
983   </doc:template>
984
985   <xsl:template name="dt:format-julian-day">
986     <xsl:param name="julian-day"/>
987     <xsl:param name="format" select="'%Y-%m-%d'"/>
988
989     <xsl:variable name="a" select="$julian-day + 32044"/>
990     <xsl:variable name="b" select="floor((4 * $a + 3) div 146097)"/>
991     <xsl:variable name="c" select="$a - floor(($b * 146097) div 4)"/>
992
993     <xsl:variable name="d" select="floor((4 * $c + 3) div 1461)"/>
994     <xsl:variable name="e" select="$c - floor((1461 * $d) div 4)"/>
995     <xsl:variable name="m" select="floor((5 * $e + 2) div 153)"/>
996
997     <xsl:variable name="day" select="$e - floor((153 * $m + 2) div 5) + 1"/>
998     <xsl:variable name="month" select="$m + 3 - 12 * floor($m div 10)"/>
999     <xsl:variable name="year" select="$b * 100 + $d - 4800 + floor($m div 10)"/>
1000
1001     <xsl:call-template name="dt:format-date-time">
1002       <xsl:with-param name="year" select="$year"/>
1003       <xsl:with-param name="month" select="$month"/>
1004       <xsl:with-param name="day" select="$day"/>
1005       <xsl:with-param name="format" select="$format"/>
1006     </xsl:call-template>
1007
1008   </xsl:template>
1009
1010   <doc:template name="dt:calculate-week-number" xmlns="">
1011     <refpurpose>Calculates the week number for a specified date.</refpurpose>
1012
1013     <refdescription>
1014       <para>Assumes Monday is the first day of the week.</para>
1015     </refdescription>
1016
1017     <refparameter>
1018       <variablelist>
1019         <varlistentry>
1020           <term>year</term>
1021           <listitem>
1022             <para>Year</para>
1023           </listitem>
1024         </varlistentry>
1025         <varlistentry>
1026           <term>month</term>
1027           <listitem>
1028             <para>Month (1 - 12; January = 1)</para>
1029           </listitem>
1030         </varlistentry>
1031         <varlistentry>
1032           <term>day</term>
1033           <listitem>
1034             <para>Day of month (1 - 31)</para>
1035           </listitem>
1036         </varlistentry>
1037       </variablelist>
1038     </refparameter>
1039
1040     <refreturn>
1041       <para>Returns the week number as a decimal number.</para>
1042     </refreturn>
1043
1044   </doc:template>
1045
1046   <xsl:template name="dt:calculate-week-number">
1047     <xsl:param name="year"/>
1048     <xsl:param name="month"/>
1049     <xsl:param name="day"/>
1050
1051     <xsl:variable name="J">
1052       <xsl:call-template name="dt:calculate-julian-day">
1053         <xsl:with-param name="year" select="$year"/>
1054         <xsl:with-param name="month" select="$month"/>
1055         <xsl:with-param name="day" select="$day"/>
1056       </xsl:call-template>
1057     </xsl:variable>
1058
1059     <xsl:variable name="d4" select="($J + 31741 - ($J mod 7)) mod 146097 mod 36524 mod 1461"/>
1060     <xsl:variable name="L" select="floor($d4 div 1460)"/>
1061     <xsl:variable name="d1" select="(($d4 - $L) mod 365) + $L"/>
1062
1063     <xsl:value-of select="floor($d1 div 7) + 1"/>
1064
1065   </xsl:template>
1066
1067   <doc:template name="dt:get-month-number" xmlns="">
1068     <refpurpose>Take a month by name and return a number which can be used as input to the templates. </refpurpose>
1069
1070     <refdescription>
1071       <para>Input</para>
1072     </refdescription>
1073
1074     <refparameter>
1075       <variablelist>
1076         <varlistentry>
1077           <term>month</term>
1078           <listitem>
1079             <para>Month as described either by full name or abbreviation.</para>
1080           </listitem>
1081         </varlistentry>
1082       </variablelist>
1083     </refparameter>
1084
1085     <refreturn>
1086       <para>Return a month as a decimal number. (Jan = 1)</para>
1087     </refreturn>
1088   </doc:template>
1089
1090   <xsl:template name='dt:get-month-number'>
1091     <xsl:param name='month'/>
1092
1093     <xsl:variable name='monToUpper'>
1094       <xsl:call-template name='str:to-upper'>
1095         <xsl:with-param name='text' select='$month'/>
1096       </xsl:call-template>
1097     </xsl:variable>
1098
1099     <xsl:choose>
1100       <xsl:when test='starts-with($monToUpper,"JAN")'>
1101         <xsl:value-of select='"1"'/>
1102       </xsl:when>
1103       <xsl:when test='starts-with($monToUpper,"FEB")'>
1104         <xsl:value-of select='2'/>
1105       </xsl:when>
1106       <xsl:when test='starts-with($monToUpper,"MAR")'>
1107         <xsl:value-of select='3'/>
1108       </xsl:when>
1109       <xsl:when test='starts-with($monToUpper,"APR")'>
1110         <xsl:value-of select='4'/>
1111       </xsl:when>      
1112       <xsl:when test='starts-with($monToUpper,"MAY")'>
1113         <xsl:value-of select='5'/>
1114       </xsl:when>
1115       <xsl:when test='starts-with($monToUpper,"JUN")'>
1116         <xsl:value-of select='6'/>
1117       </xsl:when>
1118       <xsl:when test='starts-with($monToUpper,"JUL")'>
1119         <xsl:value-of select='7'/>
1120       </xsl:when>
1121       <xsl:when test='starts-with($monToUpper,"AUG")'>
1122         <xsl:value-of select='8'/>
1123       </xsl:when>
1124       <xsl:when test='starts-with($monToUpper,"SEP")'>
1125         <xsl:value-of select='9'/>
1126       </xsl:when>
1127       <xsl:when test='starts-with($monToUpper,"OCT")'>
1128         <xsl:value-of select='10'/>
1129       </xsl:when>
1130       <xsl:when test='starts-with($monToUpper,"NOV")'>
1131         <xsl:value-of select='11'/>
1132       </xsl:when>
1133       <xsl:when test='starts-with($monToUpper,"DEC")'>
1134         <xsl:value-of select='"12"'/>
1135       </xsl:when>
1136     </xsl:choose>
1137   </xsl:template>
1138
1139   <doc:template name="dt:get-xsd-datetime-year" xmlns="">
1140     <refpurpose>Return year component of XSD DateTime value.</refpurpose>
1141
1142     <refdescription>
1143       <para>Extract component of XML Schemas DateTime value.</para>
1144     </refdescription>
1145
1146     <refparameter>
1147       <variablelist>
1148         <varlistentry>
1149           <term>xsd-date-time</term>
1150           <listitem>
1151             <para>A value in XSD DateTime format.</para>
1152           </listitem>
1153         </varlistentry>
1154       </variablelist>
1155     </refparameter>
1156
1157     <refreturn>
1158       <para>Returns year component.</para>
1159     </refreturn>
1160   </doc:template>
1161
1162   <xsl:template name='dt:get-xsd-datetime-year'>
1163     <xsl:param name='xsd-date-time'/>
1164
1165     <xsl:choose>
1166       <xsl:when test='contains($xsd-date-time, "T")'>
1167         <xsl:call-template name='dt:get-xsd-datetime-year'>
1168           <xsl:with-param name='xsd-date-time' select='substring-before($xsd-date-time, "T")'/>
1169         </xsl:call-template>
1170       </xsl:when>
1171
1172       <!-- Check for time -->
1173       <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'/>
1174
1175       <xsl:otherwise>
1176         <!-- This is a date -->
1177         <xsl:value-of select='substring-before($xsd-date-time, "-")'/>
1178       </xsl:otherwise>
1179     </xsl:choose>
1180   </xsl:template>
1181
1182   <doc:template name="dt:get-xsd-datetime-month" xmlns="">
1183     <refpurpose>Return month component of XSD DateTime value.</refpurpose>
1184
1185     <refdescription>
1186       <para>Extract component of XML Schemas DateTime value.</para>
1187     </refdescription>
1188
1189     <refparameter>
1190       <variablelist>
1191         <varlistentry>
1192           <term>xsd-date-time</term>
1193           <listitem>
1194             <para>A value in XSD DateTime format.</para>
1195           </listitem>
1196         </varlistentry>
1197       </variablelist>
1198     </refparameter>
1199
1200     <refreturn>
1201       <para>Returns month component.</para>
1202     </refreturn>
1203   </doc:template>
1204
1205   <xsl:template name='dt:get-xsd-datetime-month'>
1206     <xsl:param name='xsd-date-time'/>
1207
1208     <xsl:choose>
1209       <xsl:when test='contains($xsd-date-time, "T")'>
1210         <xsl:call-template name='dt:get-xsd-datetime-month'>
1211           <xsl:with-param name='xsd-date-time' select='substring-before($xsd-date-time, "T")'/>
1212         </xsl:call-template>
1213       </xsl:when>
1214
1215       <!-- Check for time -->
1216       <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'/>
1217
1218       <xsl:otherwise>
1219         <!-- This is a date -->
1220         <xsl:value-of select='substring(substring-after($xsd-date-time, "-"), 1, 2)'/>
1221       </xsl:otherwise>
1222     </xsl:choose>
1223   </xsl:template>
1224
1225   <doc:template name="dt:get-xsd-datetime-day" xmlns="">
1226     <refpurpose>Return day component of XSD DateTime value.</refpurpose>
1227
1228     <refdescription>
1229       <para>Extract component of XML Schemas DateTime value.</para>
1230     </refdescription>
1231
1232     <refparameter>
1233       <variablelist>
1234         <varlistentry>
1235           <term>xsd-date-time</term>
1236           <listitem>
1237             <para>A value in XSD DateTime format.</para>
1238           </listitem>
1239         </varlistentry>
1240       </variablelist>
1241     </refparameter>
1242
1243     <refreturn>
1244       <para>Returns day component.</para>
1245     </refreturn>
1246   </doc:template>
1247
1248   <xsl:template name='dt:get-xsd-datetime-day'>
1249     <xsl:param name='xsd-date-time'/>
1250
1251     <xsl:choose>
1252       <xsl:when test='contains($xsd-date-time, "T")'>
1253         <xsl:call-template name='dt:get-xsd-datetime-day'>
1254           <xsl:with-param name='xsd-date-time' select='substring-before($xsd-date-time, "T")'/>
1255         </xsl:call-template>
1256       </xsl:when>
1257
1258       <!-- Check for time -->
1259       <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'/>
1260
1261       <xsl:otherwise>
1262         <!-- This is a date -->
1263         <xsl:value-of select='substring(substring-after($xsd-date-time, "-"), 4, 2)'/>
1264       </xsl:otherwise>
1265     </xsl:choose>
1266   </xsl:template>
1267
1268   <doc:template name="dt:get-xsd-datetime-hour" xmlns="">
1269     <refpurpose>Return hour component of XSD DateTime value.</refpurpose>
1270
1271     <refdescription>
1272       <para>Extract component of XML Schemas DateTime value.</para>
1273     </refdescription>
1274
1275     <refparameter>
1276       <variablelist>
1277         <varlistentry>
1278           <term>xsd-date-time</term>
1279           <listitem>
1280             <para>A value in XSD DateTime format.</para>
1281           </listitem>
1282         </varlistentry>
1283       </variablelist>
1284     </refparameter>
1285
1286     <refreturn>
1287       <para>Returns hour component.</para>
1288     </refreturn>
1289   </doc:template>
1290
1291   <xsl:template name='dt:get-xsd-datetime-hour'>
1292     <xsl:param name='xsd-date-time'/>
1293
1294     <xsl:choose>
1295       <xsl:when test='contains($xsd-date-time, "T")'>
1296         <xsl:call-template name='dt:get-xsd-datetime-hour'>
1297           <xsl:with-param name='xsd-date-time' select='substring-after($xsd-date-time, "T")'/>
1298         </xsl:call-template>
1299       </xsl:when>
1300
1301       <!-- Check for time -->
1302       <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'>
1303         <xsl:value-of select='substring($xsd-date-time, 1, 2)'/>
1304       </xsl:when>
1305
1306       <xsl:otherwise>
1307         <!-- This is a date -->
1308       </xsl:otherwise>
1309     </xsl:choose>
1310   </xsl:template>
1311
1312   <doc:template name="dt:get-xsd-datetime-minute" xmlns="">
1313     <refpurpose>Return minute component of XSD DateTime value.</refpurpose>
1314
1315     <refdescription>
1316       <para>Extract component of XML Schemas DateTime value.</para>
1317     </refdescription>
1318
1319     <refparameter>
1320       <variablelist>
1321         <varlistentry>
1322           <term>xsd-date-time</term>
1323           <listitem>
1324             <para>A value in XSD DateTime format.</para>
1325           </listitem>
1326         </varlistentry>
1327       </variablelist>
1328     </refparameter>
1329
1330     <refreturn>
1331       <para>Returns minute component.</para>
1332     </refreturn>
1333   </doc:template>
1334
1335   <xsl:template name='dt:get-xsd-datetime-minute'>
1336     <xsl:param name='xsd-date-time'/>
1337
1338     <xsl:choose>
1339       <xsl:when test='contains($xsd-date-time, "T")'>
1340         <xsl:call-template name='dt:get-xsd-datetime-minute'>
1341           <xsl:with-param name='xsd-date-time' select='substring-after($xsd-date-time, "T")'/>
1342         </xsl:call-template>
1343       </xsl:when>
1344
1345       <!-- Check for time -->
1346       <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'>
1347         <xsl:value-of select='substring($xsd-date-time, 4, 2)'/>
1348       </xsl:when>
1349
1350       <xsl:otherwise>
1351         <!-- This is a date -->
1352       </xsl:otherwise>
1353     </xsl:choose>
1354   </xsl:template>
1355
1356   <doc:template name="dt:get-xsd-datetime-second" xmlns="">
1357     <refpurpose>Return second component of XSD DateTime value.</refpurpose>
1358
1359     <refdescription>
1360       <para>Extract component of XML Schemas DateTime value.</para>
1361     </refdescription>
1362
1363     <refparameter>
1364       <variablelist>
1365         <varlistentry>
1366           <term>xsd-date-time</term>
1367           <listitem>
1368             <para>A value in XSD DateTime format.</para>
1369           </listitem>
1370         </varlistentry>
1371       </variablelist>
1372     </refparameter>
1373
1374     <refreturn>
1375       <para>Returns second component.</para>
1376     </refreturn>
1377   </doc:template>
1378
1379   <xsl:template name='dt:get-xsd-datetime-second'>
1380     <xsl:param name='xsd-date-time'/>
1381
1382     <xsl:choose>
1383       <xsl:when test='contains($xsd-date-time, "T")'>
1384         <xsl:call-template name='dt:get-xsd-datetime-second'>
1385           <xsl:with-param name='xsd-date-time' select='substring-after($xsd-date-time, "T")'/>
1386         </xsl:call-template>
1387       </xsl:when>
1388
1389       <!-- Check for time -->
1390       <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'>
1391         <xsl:variable name='part' select='substring($xsd-date-time, 7)'/>
1392         <xsl:choose>
1393           <xsl:when test='contains($part, "Z")'>
1394             <xsl:value-of select='substring-before($part, "Z")'/>
1395           </xsl:when>
1396           <xsl:when test='contains($part, "+")'>
1397             <xsl:value-of select='substring-before($part, "+")'/>
1398           </xsl:when>
1399           <xsl:when test='contains($part, "-")'>
1400             <xsl:value-of select='substring-before($part, "-")'/>
1401           </xsl:when>
1402           <xsl:otherwise>
1403             <xsl:value-of select='$part'/>
1404           </xsl:otherwise>
1405         </xsl:choose>
1406       </xsl:when>
1407
1408       <xsl:otherwise>
1409         <!-- This is a date -->
1410       </xsl:otherwise>
1411     </xsl:choose>
1412   </xsl:template>
1413
1414   <doc:template name="dt:get-xsd-datetime-timezone" xmlns="">
1415     <refpurpose>Return timezone component of XSD DateTime value.</refpurpose>
1416
1417     <refdescription>
1418       <para>Extract component of XML Schemas DateTime value.</para>
1419     </refdescription>
1420
1421     <refparameter>
1422       <variablelist>
1423         <varlistentry>
1424           <term>xsd-date-time</term>
1425           <listitem>
1426             <para>A value in XSD DateTime format.</para>
1427           </listitem>
1428         </varlistentry>
1429       </variablelist>
1430     </refparameter>
1431
1432     <refreturn>
1433       <para>Returns timezone component.</para>
1434     </refreturn>
1435   </doc:template>
1436
1437   <xsl:template name='dt:get-xsd-datetime-timezone'>
1438     <xsl:param name='xsd-date-time'/>
1439
1440     <xsl:choose>
1441       <xsl:when test='contains($xsd-date-time, "Z")'>Z</xsl:when>
1442       <xsl:when test='contains($xsd-date-time, "T")'>
1443         <xsl:call-template name='dt:get-xsd-datetime-timezone'>
1444           <xsl:with-param name='xsd-date-time' select='substring-after($xsd-date-time, "T")'/>
1445         </xsl:call-template>
1446       </xsl:when>
1447
1448       <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'>
1449         <!-- This is a time -->
1450         <xsl:choose>
1451           <xsl:when test='contains($xsd-date-time, "+")'>
1452             <xsl:text>+</xsl:text>
1453             <xsl:value-of select='substring-after($xsd-date-time, "+")'/>
1454           </xsl:when>
1455           <xsl:when test='contains($xsd-date-time, "-")'>
1456             <xsl:text>-</xsl:text>
1457             <xsl:value-of select='substring-after($xsd-date-time, "-")'/>
1458           </xsl:when>
1459         </xsl:choose>
1460       </xsl:when>
1461       <xsl:otherwise>
1462         <!-- This is a date -->
1463         <xsl:value-of select='substring(substring-after($xsd-date-time, "-"), 6)'/>
1464       </xsl:otherwise>
1465     </xsl:choose>
1466   </xsl:template>
1467
1468   <doc:template name="dt:format-two-digit-year" xmlns="">
1469     <refpurpose>Return two digit year as four digit year value.</refpurpose>
1470
1471     <refdescription>
1472       <para>Prepend century to two digit year value.</para>
1473       <para>Century value is calculated according to suggested solutions in RFC2626 (section 5).</para>
1474       <para>Fixed window solution: 20 is prepended to year if the year is less than 50, otherwise 19 is prepended to year.</para>
1475       <para>Sliding window solution: The year is considered in the future if the year is less than the current 2 digit year plus 'n' years (where 'n' is a param), otherwise it is considered in the past.</para>
1476     </refdescription>
1477
1478     <refparameter>
1479       <variablelist>
1480         <varlistentry>
1481           <term>year</term>
1482           <listitem>
1483             <para>A year value in 2 digit format.</para>
1484           </listitem>
1485         </varlistentry>
1486         <varlistentry>
1487           <term>method</term>
1488           <listitem>
1489             <para>RFC2626 suggested solution ('fixed' or 'sliding').  Default is 'fixed'.</para>
1490           </listitem>
1491         </varlistentry>
1492         <varlistentry>
1493           <term>n</term>
1494           <listitem>
1495             <para>No. of years. Used in sliding windows solution.</para>
1496           </listitem>
1497         </varlistentry>
1498       </variablelist>
1499     </refparameter>
1500
1501     <refreturn>
1502       <para>Returns four digit year value.</para>
1503     </refreturn>
1504   </doc:template>
1505   
1506   <xsl:template name="dt:format-two-digit-year">
1507     <xsl:param name="year" />
1508     <xsl:param name="method" select="'fixed'"/>
1509
1510     <xsl:choose>
1511       <xsl:when test="string-length($year) != 2">invalid year value</xsl:when>
1512       <xsl:when test="$method = 'fixed'">
1513         <xsl:choose>
1514           <xsl:when test="$year &lt; 50">20</xsl:when>
1515           <xsl:otherwise>19</xsl:otherwise>
1516         </xsl:choose>
1517         <xsl:value-of select="$year" />
1518       </xsl:when>
1519       <xsl:when test="$method = 'window'">not yet implemented</xsl:when>
1520       <xsl:otherwise>invalid method</xsl:otherwise>
1521     </xsl:choose>
1522   </xsl:template>
1523
1524  </xsl:stylesheet>