source: trunk/Distribution/XSL/slides/keynote/xsltsl/date-time.xsl

Last change on this file was 2, checked in by jkacer, 18 years ago

Added all DocBook Framework stuff:

  • DocBook DTD
  • Transformation software FOP 0.20.5 and Saxon 6
  • XSL styles
  • Rexx scripts

Also added some WarpIN-related stuff for creation of WarpIN installation packages.
This state corresponds to version 1.0.0 from November 2005, just slightly modified to carry versioning information (Rexx scripts).

File size: 48.4 KB
Line 
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,v 1.1 2004/11/10 06:51:55 balls Exp $
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>
Note: See TracBrowser for help on using the repository browser.