format-date

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 5.)

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

   

Kategorie: Typkonvertierung und Ausgabeformatierung

Herkunft: XSLT 2.0

Rückgabewert: Ein String xs:string; der anhand eines Musterstrings und weiterer optional zu übergebender Parameter formatierte Eingabewert

Aufruf/Argumente:

format-date($datum?, $formatierungsmuster, $sprache?, $kalender?, $verortung?)

$datum:
Optional. Ein Datumswert vom Typ xs:date, der eine Zeitzonen­angabe beinhalten kann. Wird die leere Sequenz übergeben, so gibt die Funktion ebenfalls eine leere Sequenz zurück.

formatierungsmuster:
Obligatorisch. Eine Zeichenkette xs:string, die in Form eines vorgegebenen Musters (picture string) die Formatierung der resul­tierenden Zeichenkette bestimmt.

$sprache:
Optional. Eine Zeichenkette xs:string in Form eines aus zwei Zeichen bestehenden Kürzels einer Landesbezeichnung nach ISO 3166-1. Durch den dritten Parameter kann eine Sprache für die Formatierung des Datumsstrings bestimmt werden. Dies hat unmittelbar Auswirkung auf die als Namen von Wochentagen oder Monaten gewählten Bezeichner, gegebenen­falls auch auf die Reihenfolge der Ausgabe der Komponenten des Datumswer­tes. Die entsprechenden Bezeichner und üblichen Abkürzungen müssen dem System zur Verfügung stehen.

$kalender:
Optional. Eine Zeichenkette xs:string in Form einer aus Groß­buchstaben bestehenden Kurzbezeichnung desjenigen Kalenders, der der For­matierung zugrunde gelegt werden soll. Defaultwert ist der Kalender nach ISO (entsprechend dem Gregorianischen Kalender), dessen Unterstützung vorgeschrieben ist. Die Unterstützung weiterer Kalender ist implementationsabhängig.

$verortung:
Optional. Eine Zeichenkette xs:string in Form eines aus zwei Zeichen bestehenden Kürzels einer Landesbezeichnung nach ISO 3166-1. Die­ser zur Sprachangabe redundant erscheinende Parameter dient dazu, den zu formatierenden Wert geographisch zu verorten und die Formatierung der Zeit­angabe gemäß dieser Verortung zu modifizieren.

Verwendungszweck:

Die Funktion format-date() bestimmt die äußere Form, in der ein ihr als erstes Argument übergebener Datumswert xs:date als String xs:string formatiert ausgegeben wird.

Zur Bestimmung des Aussehens der Formatierung wird ein als zweites obliga­torisches Argument übergebener String als Formatierungsmuster (auch als picture string bezeichnet) zu Hilfe genommen.

Ein Funktionsaufruf ohne weitere Argumente bezieht sich auf die Default-For­matierung. Diese wird entsprechend der Systemumgebung vorgenommen. Betroffen ist die Wahl des Kalenders (z.B. Gregorianisch) und der Sprachein­stellung. Letztere hat unter anderem Einfluss auf die Reihenfolge der Kompo­nentenausgabe oder bei Tageszeitausgabe auf die Wiedergabe der Stunden­werte (0-23 vs 1-24, 0-11 vs 1-12).

Soll die Formatierung nicht anhand der Default-Einstellungen vorgenommen werden, so können mittels zweier weiterer optionaler Argumente eine expli­zite Spracheinstellung sowie der zugrunde gelegte Kalender spezifiziert wer­den. Ein fünftes Argument ist dafür vorgesehen, die Formatie­rung eines Wertes an einen geographischen Ort zu binden.

Achtung – Folgende Erläuterung gilt auch für weitere Funktionen
Die folgende, längere Erläuterung gilt ebenso für die Anwendung der XSLT-Funktionen format-dateTime() und format-time(), die zusammen mit format-date() die Gruppe der Zeitformatfunktionen (date formatting functions) von XSLT 2.0 bilden. Weitere Anwendungsbeispiele und spezifische Erklä­rungen befinden sich auch bei den jeweiligen Funktionserläute­rungen.

Das Formatierungsmuster (picture string):

Ein Formatierungsmuster – ein einfaches Beispiel wäre '[Y]-[M]-[D]' – setzt sich aus einer Reihe von String­literalen und Platzhaltersymbolen für die eigentlich zu formatierenden Werte zusammen.

Die Platzhaltersymbole sind gekennzeichnet durch sie umgebende eckige Klammern. Ihr wichtigster Bestandteil, das Komponentensymbol (component specifier), wird durch den entsprechenden Wert der zu formatierenden Datums­komponente (component) ersetzt. Zusätzliche Leerzeichen oder andere Weiß­raumzeichen (Zeilenumbrüche etc.) spielen innerhalb der Markierungen keine Rolle.

Im folgenden Beispiel sind Y, M und D als Platzhalter für Jahr (year), Monat (month) und Tag (day) enthalten:

[Y]-[M]-[D]

Die Stringliterale werden unverändert an der ihnen durch ihre Position im For­matierungsstring zugewiesenen Stelle in den Ergebnisstring kopiert. Als String­literale gelten alle Bestandteile des Formatierungsstrings, die nicht von eckigen Klammern umgeben sind (im Beispiel [Y]-[M]-[D], also die Bindestriche). Es können beliebig viele oder gar keine Stringliterale im Formatierungsstring ent­halten sein.

Maskierung der eckigen Klammer bei Ausgabe als Literal
Ist die eckige Klammer selbst Teil eines Stringliterals, so muss sie durch eine weitere, gleichartige eckige Klammer maskiert werden: eine öffnende Klammer [ zu [[, eine schließende ] zu ]] (siehe Beispiel 9).

Das Ergebnis einer Formatierung eines Datumswertes anhand des obigen For­matierungsstrings könnte also wie folgt aussehen:

[Y]-[M]-[D] => '2003-07-20'

Die Komponentensymbole:

Für die Komponentenextraktion sind eine Reihe von Kürzeln vereinbart. Es dürfen – je nach Typ des übergebenen Wertes – jedoch nur solche Komponenten im Formatierungsstring angegeben werden, die im Wert auch tatsächlich enthalten sind.

Bei Datumswerten xs:date, wie sie die Funktion format-date() erwartet, können daher Tageszeitangaben wie Stunden, Minuten, Sekunden etc. nicht extrahiert werden – der Versuch verursacht einen Fehler.

In der folgenden Tabelle sind aus Gründen der Vollständigkeit alle definierten Komponentensymbole aufgeführt – die bei dieser Funktion nicht anwendbaren sind extra gekennzeichnet.

Symbol Komponente Präsentation Beispiel

Y

Jahreszahl

numerisch

2003

M

Monat (bezogen auf Jahr)

numerisch

12

D

Tag (bezogen auf Monat)

numerisch

30

d

Tag (bezogen auf Jahr)

numerisch

365

F

Tag (Wochentag)

Bezeichner

Friday

W

Woche (Kalenderwoche)

numerisch

52

w

Woche (des Monats)

numerisch

3

H

Stunde (24 Stunden-Tag)*

numerisch

23

h

Stunde(2x12 Stunden-Tag)*

numerisch

10

P

AM/PM-Angabe*

Bezeichner

AM

m

Minute (bez. auf Stunde)*

numerisch

59

s

Sekunde (bez. auf Minute)*

numerisch

30

f

Sekunden mit Bruchteil*

numerisch

59.99

Z

Zeitzone UTC

Dauer

+2:00

z

Zeitzone GMT

Bez. + Dauer

GMT +2:00

C

verwendeter Kalender

Bezeichner

Gregorian

E

Bezugsära

Bezeichner

[Herschername]

Tabelle: Vollständige Liste der Komponentensymbole (*=: Im Kontext nicht anwendbar).

Anmerkung: Die Tageszeitkomponenten H, h, P, m, s, f können in Zusammenhang mit format-date() nicht verwendet werden.

Die beiden Zeitzonensymbole werden wie folgt interpretiert:

Z steht für eine Zeitzonenangabe bezogen auf UTC-Zeit, die entweder nume­risch als Zeitdifferenz ausgegeben werden kann oder mit Modifikator N durch ZN als Zeitzonenbezeichner (z.B. EST für Eastern Standard Time). Besteht keine Differenz (die Zeitangabe liegt bereits in UTC vor), so wird dies durch den Buchstaben Z symbolisiert.

z steht für eine Zeitzonenangabe bezogen auf GMT-Zeit, die als Zeitdifferenz in der Form GMT ± [hh:00] präsentiert wird, beispielsweise GMT + 2:00.

Die Modifikatoren:

Über die einfache Wertextraktion hinaus können innerhalb der Platzhaltermarkierungsklammern für jeden Komponentenplatz­halter weitere Formatierungsoptionen beschrieben werden, die die Präsenta­tion der Komponente betreffen.

Hierzu dienen maximal zwei optionale Modifikatoren – ein primärer und ein sekundärer Modifikator, die an den Komponentenplatzhalter in Form eines Suffixes angehängt werden können. Der sekundäre Modifikator darf nur zusammen mit einem primären Modifikator angewendet werden. Wird ein angegebener Präsentationsmodifikator durch die eine Implementation nicht unterstützt, so wird für die entsprechende Komponente statt dessen die Defaultpräsentation verwendet.

Beispielsweise kann der Platzhalter für den Monatswert M durch Anhängen eines N von der Ausgabe eines numerischen Wertes auf die des Monatsnamens umgeschaltet werden (in diesem Fall in Großbuchstaben):

[M] => 11

[MN] => NOVEMBER

Ein angehängtes kleines n bezeichnet die Ausgabe mit Kleinbuchstaben (der Anfangsbuchstabe kann je nach Sprache groß sein):

[Mn] => November

Sprachabhängigkeit des auszugebenden Namens
Die Wahl des auszugebenden Namens ist sprachabhängig: »Tues­day« (en), »Dienstag« (de), »Mardi« (fr) etc. Darüber hinaus können eventu­ell auch regionale Unterschiede berücksichtigt werden (Deutsch: »Samstag« oder »Sonnabend«). Die zu verwendende Sprache wird über das dritte Funk­tionsargument festgelegt – die Angabe erfolgt in Form eines aus zwei Zei­chen bestehenden Kürzels einer Landesbezeichnung nach ISO 3166-1.

Als primäre Modifikatoren stehen generell zur Verfügung:

Symbol Bedeutung Beispiel Wirkung

A

Großbuchstaben

MA

DECEMBER

a

Kleinbuchstaben

Ma

December

N

Bezeichner, Großbuchstaben

MN

DECEMBER

n

Bezeichner, Kleinbuchstaben

Mn

December

I

Römisch Ziffern, groß

MI

XII (Dezember)

i

Römische Ziffern, klein

Mi

xii (Dezember)

1 (digit)

Ziffern, Unicode-Set*

M1

12 (Dezember)

Tabelle: Die primären Modifikatoren.

* Erklärung zu 1 (digit): Stellvertretend für eine Präsentation durch Ziffern beliebiger Art kann hier jedes Unicode-Zeichen stehen, das den dezimalen Wert 1 besitzt (gemäß der Unicode Property-Datenbank). Der Wert wird mit Hilfe der so bezeichneten Zifferngruppe präsentiert. (In der Theorie kann beispielsweise arabische Bezifferung durch die arabische Ziffer 1 (U+0661) und tibetische durch die tibetische Ziffer 1 (U+0F21) angeordnet werden.) Es dürfen im Prinzip auch beliebige andere Zeichen stehen, um eine Bezifferungsreihe beginnend mit dem entsprechenden Zeichen anzugeben – natürlich nur, sofern eine solche Bezifferung durch die Implementation unterstützt wird. Mittels führender Nul­len (z.B. 001) kann im Format-Token die Auffüllung durch Nullen (oder ein ent­sprechendes Zeichen) auf eine festgelegte Stellenzahl vorgenommen werden.

Als sekundäre Modifikatoren stehen darüberhinaus zur Verfügung:

Symbol Bedeutung Beispiel Wirkung

t

traditionelle Nummerierung*

D1t

31

o

ordinale Nummerierung
Hinweis: nur zusätzlich zu primärem Modifikator

D1o

31st
(lang="en")

Tabelle: Sekundäre Modifikatoren.

Die Längenangabe:

Normalerweise wird der Teilstring jeder Komponente in voller Länge (full representation) ausgegeben. Die formatierte Ausgabe kann jedoch pro Komponente durch eine hinzugefügte Längenangabe auch auf eine bestimmte Zahl jeweils zu verwendender Zeichen beschränkt werden. Diese Längenangabe ist eigentlich eine Bereichsangabe, zusammengesetzt aus Anga­ben für Mindest- und Höchstlänge. Die Angabe einer Höchstlänge ist innerhalb der Längenangabe optional – entfällt sie, wird die Komponente in voller Länge (jedoch mit der angegebenen Mindestlänge) ausgegeben.

Überschreitet die Formatierung mittels des Formattokens die angegebene Höchstlänge (beispielsweise durch Forderung nach führenden Nullen bei numerischer Ausgabe), so hat die Längenangabe im Zweifelsfall Vorrang.

Der Längenindikator wird, durch ein Komma getrennt, hinter die Komponen­tenangabe (mit eventuellen Modifikatoren) geschrieben. Beispiel:

'2007' wird gekürzt zu '07': [Y, 2-2] => 07

Der Stern * ist ein Stellvertreter für eine beliebige ganze Zahl, lässt hier also die Mindestlänge offen. Die 3 beschränkt die Höchstlänge des Komponentenst­rings auf drei Zeichen. Da es in den meisten Sprachen keine Monatsnamen mit weniger als drei Zeichen gibt, werden die Namen effektiv auf drei Zeichen gekürzt. Würde dagegen die Höchstlänge mit Stern * angegeben, so könnte die entsprechende Angabe entfallen. Beispiel:

'December' wird gekürzt zu 'Dec': [Mn,*-3] => Dec

Die Art und Weise der Kürzung ist abhängig von den Konventionen der gewählten Sprache – es handelt sich im Fall von Namen zum Teil um eine echte Abkürzung statt einer einfachen Längenbeschneidung (dies kann jedoch ver­schieden gehandhabt werden). Beispielsweise kann bei namentlicher Ausgabe der Wochentag bei Beschränkung auf (maximal!) vier Zeichen durchaus auch als Abkürzung aus nur drei Zeichen ausgegeben werden, sofern diese »üblich« sind:

'Tuesday' wird zu 'Tues': [Dn,*-3] => Tues

'Friday' jedoch zu 'Fri': [Dn,*-3] => Fri

In diesem Fall ist die minimale Ausgabelänge nicht festgelegt, die Höchstzahl darf also unterschritten werden. Eine Festlegung auf genau vier Zeichen ließe sich mit [Dn, 4-4] erreichen.

Unterschreitet die eigentliche Länge des Werts der auszugebenden Kompo­nente die Mindestlänge, so wird der String entsprechend verlängert (padding). Dies geschieht durch Leerzeichen, die am Anfang des Teilstrings eingefügt wer­den, im Fall von Zahlenwerten durch vorangestellte führende Nullen:

[D], [M] [Y] => 1. 4. 2003

[D,2], [M,2] [Y] => 01. 04. 2007

Hinweis: Ist die Kürzung der Ausgabe nicht sinnvoll möglich (z.B. bei längeren Römischen Zahlen), so wird die Komponente trotz Längenangabe in voller Länge ausgegeben.

Die Kalenderangabe:

Die Darstellung von Datumswerten, entsprechend unterschiedlicher Kalender, ist keine triviale Angelegenheit. Um den Rückga­bewert der Zeitformatfunktion entsprechend anzupassen, kann den Funktio­nen mittels des calendar-Parameters die Verwendung eines bestimmten Kalenders zugrunde gelegt werden. Hierbei ist derzeit nur die Fähigkeit zur Formatierung gemäß des Gregorianischen bzw. des ISO-Kalenders (der in den meisten Fällen ohnehin Defaultkalender sein wird) oder mindestens eines der anderen angegebenen Kalender vorgeschrieben. Die Unterstützung weiterer Kalender, auch über die unten beigefügte empfohlene Liste hinausgehend, ist der Applikation freigestellt.

Speicherung und Verarbeitung von Datumswerten in Rechnersystemen ist von vornherein stark an den Gregorianischen Kalender (ISO-Kalender) angelehnt, doch ist dieser nicht in allen Kulturen gültig, wobei sich teilweise extreme Umrechnungsprobleme ergeben können. Nur zur Verdeutlichung:

Der jüdische Kalender (in der Tabelle mit AM »Anno Mundi« bezeichnet) basiert auf Sonnen- und Mondzyklen und besitzt Schaltjahre mit jeweils drei­zehn Monaten innerhalb von 19-jährigen Phasen (die Jahre 3, 6, 8, 11, 14 und 19), die Jahre haben daher 354 oder 385 Tage. Er beginnt seine Zeitrechnung (Jahr 1) am 6. Oktober -3760 des Julianischen Kalenders. Das christliche Jahr 2000 (AD) entspricht also dem Jahr 5760 (AM). Es werden Monate von 29 Tagen und 30 Tagen Länge verwendet. Tage beginnen mit dem Sonnenunter­gang.

Der islamische Kalender (in der Tabelle mit AH »Anno Hegiare« bezeichnet) ist ein lunarer Kalender, bei dem Monate den Mondzyklen entsprechen, was gemessen am Sonnenjahr über einen Zeitraum von etwa 33 Jahren zu einer Verschiebung durch die Jahreszeiten führt (ein Jahr besitzt nur 354 Tage). Die Sichtung der Mondsichel nach Neumond bestimmt den Beginn eines neuen Monats (für nicht religiöse Zwecke wird eine Tabelle verwendet). Tage begin­nen mit dem Sonnenuntergang. Das Jahr 2000 (AD) entspricht dem Jahr 1421 (AH).

Der historische Julianische Kalender (in der Tabelle mit OS »Old Style« bezeichnet) ist ein solarer Kalender, der im Jahre 46 v. Chr. durch Julius Cäsar eingeführt wurde. Das Kalenderjahr besteht aus 365 Tagen, wobei jedes vierte Jahr ein Schaltjahr mit 366 Tagen ist. Ein Julianisches Jahr erwies sich jedoch gegenüber dem eigentlichen Sonnenjahr als ca. elf Minuten zu lang, was bis zum 16. Jahrhundert einen Fehler von zehn vollen Tagen auflaufen ließ (ca. ein Tag alle 128 Jahre).

Der Gregorianische Kalender (in der Tabelle mit AD »Anno Domini« bezeich­net) entstand durch eine von Papst Gregor XIII. im Jahre 1582 vorgenommene Korrektur. Abweichend zum Julianischen Kalender werden von den Jahren mit vollen Hunderterzahlen nur diejenigen als Schaltjahre gerechnet, deren Zahl durch 400 teilbar ist (aus diesem Grund war im Gegensatz zum Jahr 2000 das Jahr 1900 kein Schaltjahr). Der Gregorianische Kalender ist heute in den meis­ten Teilen der Welt allgemein in Gebrauch. Das Datum der faktischen Einfüh­rung variiert stark.

Der Kalender nach ISO 8601 (in der Tabelle mit ISO bezeichnet) entspricht dem Gregorianischen Kalender, erlaubt aber im Gegensatz zu diesem keine lan­des- oder sprachspezifischen Nummerierungen zur Bezeichnung von Wochen­tagen oder Kalenderwochen (speziell ist Montag stets Tag 1 und Sonntag Tag 7; als erste Kalenderwoche gilt diejenige, die den ersten Donnerstag des Jahres enthält). Der ISO-Kalender entspricht somit den Gepflogenheiten der Datums­notation von XML Schema und richtet sich im Wesentlichen an Software-Appli­kationen, die Datumswerte verarbeiten müssen.

Insgesamt vorgesehen ist eine Unterstützung weitgehend aller derzeit gebräuchlichen Kalender, wie sie in der folgenden Tabelle aufgelistet sind:

Kürzel Kalender

AD

Anno Domini, christliche Zeitrechnung;
identisch mit Gregorianischem Kalender, gültig seit 1582

AH

Anno Hegirae, mohammedanische Zeitrechnung; beginnt mit der Auswanderung Mohammeds von Mekka nach Medina (Hidschra), also 622 nach christlicher Zeitrechnung.
(2000 AD entspricht 1421 AH)

AM

Anno Mundi, Jüdischer Kalender;
außerhalb von Israel nur für religiöse Zwecke verwendet
(2000 AD entspricht 5760 AM)

AME

Mauludische Zeitrechnung;
Sonnenjahre seit der Geburt Mohammeds
(2000 AD entspricht ca. 1433 AME)

AP

Anno Persici, Persischer Kalender
(2000 AD entspricht 1379 AP)

AS

Aji Saka Zeitrechnung, Java; lunarer Kalender 354 Tage-Jahr, 
Umrechnung nicht ermittelbar

BE

Buddhistische Zeitrechnung
(2000 AD entspricht 2543 BE)

CB

Cooch Behar Zeitrechnung, West Bengalen,
Umrechnung nicht ermittelbar

CE

Allgemeine säkularisierte Zeitrechnung (Common Era);
entspricht AD ohne religiösen Hintergrund
(2000 AD entspricht 2000 CE)

CL

Chinesische Lunare Zeitrechnung (folgt 60 Jahres-Zyklus), 
Umrechnung problematisch

CS

Chula Sakarat Zeitrechnung, Burma
(2000 AD entspricht 1362 CS)

EE

Äthiopische Zeitrechnung
(2000 AD entspricht 1992 EE)

FE

Fasli Zeitrechnung, Iran 
(2000 AD entspricht 1410 FE)

ISO

ISO 8601-Kalender
(2000 AD entspricht 2000 ISO)

JE

Japanischer Kalender, ungebräuchlich
(2000 AD entspricht 2660 JE)

KE

Khalsa Zeitrechnung, Sikh Kalender, Indien
(2000 AD entspricht ca. 1700 KE)

KY

Kali Yuga, Indien;
Zeitalter von Kali nach den Vedischen Schriften
(2000 AD entspricht ca. 5102 KY)

ME

Malabar Zeitrechnung, Indien
(2000 AD entspricht 1175 ME)

MS

Monarchisch Solare Zeitrechnung
(2000 AD entspricht 2559 MS)

NS

Nepal Samwat Zeitrechnung (Bikram Sambat), Nepal
(2000 AD entspricht ca. 2057 NS)

OS

Old Style; Julianischer Kalender bis 1582
(2000 AD entspricht 2000 OS)

RS

Rattanakosin Zeitrechnung (Rata Nakosinook), Bangkok
(2000 AD entspricht 219 RS)

SE

Saka Zeitrechnung, Indien
(2000 AD entspricht 1921 SE)

SH

Mohammedanische Solare Zeitrechnung, Iran
(2000 AD entspricht 1379 SH)

SS

Saka Samvat Zeitrechnung, Indien
(2000 AD entspricht 1922 SS)

TE

Tripurabda Zeitrechnung, Indien
(2000 AD entspricht 1410 TE)

VE

Vikrama Zeitrechnung, Indien
Umrechnung nicht ermittelbar, entspricht wahrscheinlich VS

VS

Vikrama Samvat Zeitrechnung, Indien
(2000 AD entspricht 2057 VS)

Tabelle: Die in XSLT 2.0 (theoretisch) unterstützten Kalender.

Anmerkung – diese Kalenderliste ist unvollständig
In Indien (und nicht nur dort) gibt es noch weitere Zeitrech­nungen und Kalender, wie z.B. Saptarsi Saka, Brihaspati Samvatsara, Gupta Saka, Vallabhi Saka und mehr. Die obige Tabelle könnte also beliebig ergänzt werden.

Die Verortungsangabe:

Das auch als country-Parameter bekannte opti­onale fünfte Argument des Funktionsaufrufs soll implementationsbedingt regi­onalen und historischen Unterschieden in der Kalenderinterpretation Rech­nung tragen, wo dies über den reinen Spracheinstellungsparameter nicht möglich ist.

Damit abgedeckt sind Fälle, in denen sich die kalendarische Rechnung inner­halb einer geographisch umrissenen Region zu einem bestimmten Zeitpunkt ändert, sodass Zeitangaben verschieden zu formatieren sind, je nachdem, ob sie vor oder nach der Umstellung angesiedelt sind. Hierbei ist die Begrenzung der betrachteten Region anhand der beispielsweise politischen Grenzen zum betrachteten Zeitpunkt zu berücksichtigen. Liegt die Zeitangabe in der Zukunft, werden die aktuell bestehenden Grenzen zugrunde gelegt.

Speziell im Indischen bzw. Ostasiatischen Raum liegen entsprechende Kalen­derumstellungen teilweise nur etwas mehr als fünf Jahrzehnte zurück – Imple­mentationen, die mit entsprechenden Daten umgehen (beispielsweise für den Thailändischen Markt, Buddhistische Zeitrechnung BE), wären allein durch die Sprachangabe jedoch nicht in Stand gesetzt, dies entsprechend zu berücksichti­gen. Im europäischen Raum muss man entsprechend weiter zurückgehen – so erfolgte die Umstellung vom Julianischen zum Gregorianischen Kalender lan­des- und regionalabhängig zu verschiedenen Zeitpunkten: Deutschland 1700, England 1752, Türkei 1916. In China wurde der Gregorianische Kalender erst im Jahre 1949 eingeführt.

Beispiele:

Der in allen folgenden Beispielen verwendete Datumswert $d vom Typ xs:date entspricht dem 31. Dezember 2007.

Beispiel 1 – Einfache Datumsformatierung:

format-date($d,"[Y]-[M]-[D]")

ergibt: 2007-12-31

In diesem Fall werden einfach die Zahlenwerte der jeweiligen Komponenten entnommen und in entsprechender Reihenfolge mit den vorgesehenen String­literalen versehen ausgegeben.

Beispiel 2 – Einfache Datumsformatierung, Version 2:

format-date($d,"[M]-[D]-[Y]")

ergibt: 12-31-2007

Prinzipiell eine Variante von Beispiel 1. Die Reihenfolge der Ausgabe entspricht der Reihenfolge der Platzhalter im Musterstring.

Beispiel 3 – Einfache Datumsformatierung, Version 3:

format-date($d,"[D]. [M]. [Y]")

ergibt: 31. 12. 2007

Hier werden andere Stringliterale verwendet. Die Ausgabe entspricht der Kon­vention im deutschen Sprachraum, wird aber nicht über eine Datumsformatde­klaration mit language-Attribut erreicht, sondern unmittelbar durch die Form des Musterstrings, der die erforderliche Interpunktion als Stringliterale enthält.

Beispiel 4 – Einfache Datumsformatierung, Monat römisch:

format-date($d,"[D1] [MI] [Y]")

ergibt 31 XII 2007

Der Wert der Tageskomponente wird dezimal ausgegeben (D1; D mit Modifika­tor 1, der hier aber auch weggelassen werden kann), der Monat mit großen römischen Ziffern (MI; M mit Modifikator I). Die Stringliterale bestehen hier nur aus eingeschobenen Leerzeichen.

Beispiel 5 – Datumsformatierung mit Datumsformatdeklaration (1):

format-date($d,"[D1o] [Mn], [Y]", "en", (), ())

ergibt: 31st December, 2007

Die Monatsnamen werden gemäß den Regeln der mit dem dritten Argument "en" bezeichneten Sprache als Bezeichner mit Groß- und Kleinbuchstaben aus­gegeben (Mn; M mit Modifikator n).

Der Tag wird mit Ordinal ausgegeben. Da dies nur über den sekundären Modi­fikator möglich ist, muss die 1, obwohl nicht in diesem Sinne »modifizierend«, als primärer Modifikator vorhanden sein (D1o; D mit 1 als primärem und o als sekundärem Modifikator).

Es wird der Defaultkalender verwendet, da für das calendar-Argument der leere String übergeben wurde.

Aus formalen Gründen wurde ebenfalls für das nicht eingesetzte Verortungs-Argument die leere Sequenz übergeben.

Beispiel 6 – Datumsformatierung mit Datumsformatdeklaration (2):

format-date($d,"[Mn] [D], [Y]", "en", (), ())

ergibt: 31 December, 2007

Hier wird dieselbe Spracheinstellung wie in Beispiel 5 verwendet. Der Monats­wert wird als Bezeichner ausgegeben, wobei Kleinbuchstaben gestattet sind. Der Anfangsbuchstabe wird – sprachspezifisch! – als Großbuchstabe wiederge­geben (Mn; M mit Modifikator n).

Beispiel 7 – Datumsformatierung mit Datumsformatdeklaration (3):

format-date($d,"[D] [MN,*-3] [Y]", "en", (), ())

ergibt: 31 DEC 2007

Hier wird wiederum dieselbe Spracheinstellung wie in Beispiel 5 verwendet. Der Monatswert wird als Bezeichner in Großbuchstaben ausgegeben (MN; M mit Modifikator N). Zusätzlich ist eine Längenbeschränkung der Ausgabe des Bezeichners auf 3 Zeichen gefordert, ohne Angabe einer unteren Schwelle (*-3).

Zusätzliche Leerzeichen erzwingen Mindestzeichenzahl der Ausgabe
Existieren in der gewählten Sprache Monatsbezeichner mit nur zwei Buchstaben, so werden diese unverändert ausgegeben. Gäbe man aller­dings eine untere Schwelle von drei Zeichen an (3-3), so würde in jenen Fällen die Mindestzeichenzahl durch vorangestellte Leerzei­chen erzwungen.

Beispiel 8 – Datumsformatierung mit Datumsformatdeklaration (4):

format-date($d,"[Fn] [D] [Mn] [Y]", "sv", (), ())

ergibt: Onsdag 31 December 2007

Der Funktionsaufruf bestimmt Schwedisch als Formatierung. Der Prozessor muss entsprechend die Ausgabe in schwedischer Sprache unterstützen, sonst schlägt der Funktionsaufruf fehl.

Da das (vierte) calendar-Argument nicht übergeben wurde, gilt der Defaultka­lender »Gregorian«.

Beispiel 9 – Eckige Klammern im Stringliteral:

format-date($d,"[[[Y]-[M]-[D]]]")

ergibt: [2003-04-07]

Um den Datumstring, wie hier, mit eckigen Klammern zu umgeben, müssen diese als Stringliterale ausgegeben werden. Dies ist durch die Verdoppelung jeder literal auszugebenden eckigen Klammer zu erreichen. Hierdurch ergibt sich am Anfang des Musterstrings eine Folge von drei eckigen Klammern, von denen die ersten zwei das Stringliteral (inkl. Maskierung) darstellen, und die dritte den Beginn des ersten Platzhaltersymbol signalisiert. Analog ist die Situ­ation am Ende des Strings.

Beispiel 10 – Jüdischer Kalender mit westlicher Bezifferung:

format-date($d, "[D] [Mn] [Y]", "he", "AM", ())

ergibt: 5768 תבט26

Die Verwendung des Jüdischen Kalenders durch Übergabe des Kalender-Para­meters mit Wert "AM" bewirkt eine Umrechnung des Jahres 2007 in das Jahr 5768 nach Jüdischem Kalender. Die Spracheinstellung "he" für Hebräisch gibt einerseits den hebräischen Monatsnamen aus und bewirkt andererseits die Ausgabe der Form Jahr, Monat, Tag.

Beispiel 11 – Julianischer Kalender (Old Style):

format-date($d, "[D] [MNn] [Y]", "en", "OS", ())

ergibt: 18 December 2007

Die Verwendung des Julianischen Kalenders bewirkt bei der Formatierung eine Verschiebung der Tageszählung vom 31. zum 18. Dezember. Die Verschiebung gegenüber dem Eingangsdatum 31.12.2007 um 13 Tage ergibt sich aus der differierenden Länge des zugrunde gelegten Sonnenjahres (da das Julianische Jahr zu lang ist, verschiebt sich das ausgegebene Datum nach rückwärts).

Funktionsdefinition:

XSLT 1.0:

Funktion nicht verfügbar

XSLT 2.0:

format-date($value as xs:date?,
            $picture as xs:string) as xs:string?
format-date($value as xs:date?,
            $picture as xs:string, 
            $language as xs:string?,
            $calendar as xs:string?, 
            $country as xs:string?) as xs:string?
Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn