Datums- und Uhrzeitangaben formatieren

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie wollen Datums- und Uhrzeitangaben basierend auf einem Formatstring formatieren.

Lösung

Diese Templates greifen auf die Templates zurück, die bereits in diesem Kapitel präsentiert wurden. format-date-time verwendet einen Formatstring, wobei %x eine Formatierungsanweisung ist (siehe später) und alle anderen Texte wörtlich ausgegeben werden. Das vorgegebene Format ist das ISO-Datums/Uhrzeit-Format für gregorianische Daten:

<xsl:template name="ckbk:format-date-time">
  <xsl:param name="year"/>
  <xsl:param name="month"/>
  <xsl:param name="day"/>
  <xsl:param name="hour"/>
  <xsl:param name="minute"/>
  <xsl:param name="second"/>
  <xsl:param name="time-zone"/>
  <xsl:param name="format" select="'%Y-%m-%dT%H:%M:%S%z'"/>
  <xsl:choose>
    <xsl:when test="contains($format, '%')">
      <xsl:value-of select="substring-before($format, '%')"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$format"/>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:variable name="code" select="substring(substring-after($format, '%'), 1, 1)"/>
  <xsl:choose>
    <!-- Abgekürzter Wochentagsname -->
    <xsl:when test="$code='a'">
      <xsl:variable name="day-of-the-week">
        <xsl:call-template name="ckbk:calculate-day-of-the-week">
          <xsl:with-param name="year" select="$year"/>
          <xsl:with-param name="month" select="$month"/>
          <xsl:with-param name="day" select="$day"/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:call-template name="ckbk:get-day-of-the-week-abbreviation">
        <xsl:with-param name="day-of-the-week" select="$day-of-the-week"/>
      </xsl:call-template>
    </xsl:when>
    <!-- Vollständiger Wochentagsname -->
    <xsl:when test="$code='A'">
      <xsl:variable name="day-of-the-week">
        <xsl:call-template name="ckbk:calculate-day-of-the-week">
          <xsl:with-param name="year" select="$year"/>
          <xsl:with-param name="month" select="$month"/>
          <xsl:with-param name="day" select="$day"/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:call-template name="ckbk:get-day-of-the-week-name">
        <xsl:with-param name="day-of-the-week" select="$day-of-the-week"/>
      </xsl:call-template>
    </xsl:when>
    <!-- Abgekürzter Monatsname -->
    <xsl:when test="$code='b'">
      <xsl:call-template name="ckbk:get-month-abbreviation">
        <xsl:with-param name="month" select="$month"/>
      </xsl:call-template>
    </xsl:when>
    <!-- Vollständiger Monatsname -->
    <xsl:when test="$code='B'">
      <xsl:call-template name="ckbk:get-month-name">
        <xsl:with-param name="month" select="$month"/>
      </xsl:call-template>
    </xsl:when>
    <!-- Datums- und Uhrzeitrepräsentation entsprechend der Lokalisierung -->
    <xsl:when test="$code='c'">
      <xsl:text>[not implemented]</xsl:text>
    </xsl:when>
    <!-- Tag des Monats als Dezimalzahl (01 - 31) -->
    <xsl:when test="$code='d'">
      <xsl:value-of select="format-number($day,'00')"/>
    </xsl:when>
    <!-- Stunde im 24-Stunden-Format (00 - 23) -->
    <xsl:when test="$code='H'">
      <xsl:value-of select="format-number($hour,'00')"/>
    </xsl:when>
    <!-- Stunde im 12-Stunden-Format (01 - 12) -->
    <xsl:when test="$code='I'">
      <xsl:choose>
        <xsl:when test="$hour = 0">12</xsl:when>
        <xsl:when test="$hour &lt; 13">
          <xsl:value-of select="format-number($hour,'00')"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="format-number($hour - 12,'00')"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:when>
    <!-- Tag des Jahres als Dezimalzahl (001 - 366) -->
    <xsl:when test="$code='j'">
      <xsl:variable name="diff">
        <xsl:call-template name="ckbk:date-difference">
          <xsl:with-param name="from-year" select="$year"/>
          <xsl:with-param name="from-month" select="1"/>
          <xsl:with-param name="form-day" select="1"/>
          <xsl:with-param name="to-year" select="$year"/>
          <xsl:with-param name="to-month" select="$month"/>
          <xsl:with-param name="to-day" select="$day"/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select="format-number($diff + 1, '000')"/>
    </xsl:when>
    <!-- Monat als Dezimalzahl (01 - 12) -->
    <xsl:when test="$code='m'">
      <xsl:value-of select="format-number($month,'00')"/>
    </xsl:when>
    <!-- Minute als Dezimalzahl (00 - 59) -->
    <xsl:when test="$code='M'">
      <xsl:value-of select="format-number($minute,'00')"/>
    </xsl:when>
    <!-- AM/PM-Indikator der aktuellen Lokalisierung für die 12-Stunden-Uhr -->
    <xsl:when test="$code='p'">
      <xsl:choose>
        <xsl:when test="$hour &lt; 12">AM</xsl:when>
        <xsl:otherwise>PM</xsl:otherwise>
      </xsl:choose>
    </xsl:when>
    <!-- Sekunde als Dezimalzahl (00 - 59) -->
    <xsl:when test="$code='S'">
      <xsl:value-of select="format-number($second,'00')"/>
    </xsl:when>
    <!-- Woche des Jahres als Dezimalzahl, mit Sonntag als erstem Tag der Woche (00 - 53) -->
    <xsl:when test="$code='U'">
      <!-- add 1 to day -->
      <xsl:call-template name="ckbk:calculate-week-number">
        <xsl:with-param name="year" select="$year"/>
        <xsl:with-param name="month" select="$month"/>
        <xsl:with-param name="day" select="$day + 1"/>
      </xsl:call-template>
    </xsl:when>
    <!-- Wochentag als Dezimalzahl (0 - 6; Sonntag ist 0) -->
    <xsl:when test="$code='w'">
      <xsl:call-template name="ckbk:calculate-day-of-the-week">
        <xsl:with-param name="year" select="$year"/>
        <xsl:with-param name="month" select="$month"/>
        <xsl:with-param name="day" select="$day"/>
      </xsl:call-template>
    </xsl:when>
    <!-- Woche des Jahres als Dezimalzahl, mit Montag als erstem Tag der Woche (00 - 53) -->
    <xsl:when test="$code='W'">
      <xsl:call-template name="ckbk:calculate-week-number">
        <xsl:with-param name="year" select="$year"/>
        <xsl:with-param name="month" select="$month"/>
        <xsl:with-param name="day" select="$day"/>
      </xsl:call-template>
    </xsl:when>
    <!-- Datumsrepräsentation für die aktuelle Lokalisierung -->
    <xsl:when test="$code='x'">
      <xsl:text>[not implemented]</xsl:text>
    </xsl:when>
    <!-- Zeitrepräsentation für die aktuelle Lokalisierung -->
    <xsl:when test="$code='X'">
      <xsl:text>[not implemented]</xsl:text>
    </xsl:when>
    <!-- Jahr ohne Jahrhundert als Dezimalzahl (00 - 99) -->
    <xsl:when test="$code='y'">
      <xsl:value-of select="format-number($year mod 100,'00')"/>
    </xsl:when>
    <!-- Jahr mit Jahrhundert als Dezimalzahl -->
    <xsl:when test="$code='Y'">
      <xsl:value-of select="format-number($year,'0000')"/>
    </xsl:when>
    <!-- Zeitzonenname oder -abkürzung; keine Zeichen, falls Zeitzone unbekannt ist -->
    <xsl:when test="$code='z'">
      <xsl:value-of select="$time-zone"/>
    </xsl:when>
    <!-- Prozentzeichen -->
    <xsl:when test="$code='%'">
      <xsl:text>%</xsl:text>
    </xsl:when>
  </xsl:choose>
  <xsl:variable name="remainder" select="substring(substring-after($format, '%'), 2)"/>
  <xsl:if test="$remainder">
    <xsl:call-template name="ckbk:format-date-time">
      <xsl:with-param name="year" select="$year"/>
      <xsl:with-param name="month" select="$month"/>
      <xsl:with-param name="day" select="$day"/>
      <xsl:with-param name="hour" select="$hour"/>
      <xsl:with-param name="minute" select="$minute"/>
      <xsl:with-param name="second" select="$second"/>
      <xsl:with-param name="time-zone" select="$time-zone"/>
      <xsl:with-param name="format" select="$remainder"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>
<xsl:template name="ckbk:format-julian-day">
  <xsl:param name="julian-day"/>
  <xsl:param name="format" select="'%Y-%m-%d'"/>
  <xsl:variable name="a" select="$julian-day + 32044"/>
  <xsl:variable name="b" select="floor((4 * $a + 3) div 146097)"/>
  <xsl:variable name="c" select="$a - floor(($b * 146097) div 4)"/>
  <xsl:variable name="d" select="floor((4 * $c + 3) div 1461)"/>
  <xsl:variable name="e" select="$c - floor((1461 * $d) div 4)"/>
  <xsl:variable name="m" select="floor((5 * $e + 2) div 153)"/>
  <xsl:variable name="day" select="$e - floor((153 * $m + 2) div 5) + 1"/>
  <xsl:variable name="month" select="$m + 3 - 12 * floor($m div 10)"/>
  <xsl:variable name="year" select="$b * 100 + $d - 4800 + floor($m div 10)"/>
  <xsl:call-template name="ckbk:format-date-time">
    <xsl:with-param name="year" select="$year"/>
    <xsl:with-param name="month" select="$month"/>
    <xsl:with-param name="day" select="$day"/>
    <xsl:with-param name="format" select="$format"/>
  </xsl:call-template>
</xsl:template>

XSLT 2.0

Verwenden Sie die XSLT 2.0-Funktionen zur Datumsformatierung. Im folgenden Fragment gehe ich davon aus, dass Sie das Datum als einen String der Form JJJJMMTT vorliegen haben, was gebräuchlicher ist als das ISO-Datumsformat, das format-date verlangt:

<xsl:param name="date" as="xs:string"/>
<invoiceDate>
  <xsl:value-of select="format-date(xs:date(concat(substring($date,1,4),'-',substring($date,5,2),'-',substring($date,7,2))),'[MNn] [D01], [Y0001]')"/>
</invoiceDate>

Dies würde Folgendes für $date='20050811' ausgeben:

<invoiceDate>August 11, 2005</invoiceDate>

Diskussion

XSLT 1.0

Dieses Beispiel wurde durch die ganze Datumsarbeit in den vorangegangenen Beispielen ermöglicht. Die Optionen, die eine Lokalisierung erfordern, sind nicht implementiert, könnten aber mit Hilfe von Erweiterungsfunktionen implementiert werden (siehe unter Code-Generierung).

XSLT 2.0

Hier folgt ein Auszug aus der W3C-Spezifikation.

Drei Funktionen werden angegeben, um Daten und Uhrzeiten als String zu repräsentieren, wobei die Konventionen eines ausgewählten Kalenders und einer bestimmten Lokalisierung verwendet werden. Jede besitzt zwei Varianten:

format-dateTime($value as xs:dateTime?,
                $picture as xs:string,
                $date-format-name as xs:string) as xs:string?

format-dateTime($value as xs:dateTime?, $picture as xs:string) as xs:string?

format-date($value as xs:date?,
            $picture as xs:string,
            $date-format-name as xs:string) as xs:string?

format-date($value as xs:date?, $picture as xs:string) as xs:string?

format-time($value as xs:time?,
            $picture as xs:string,
            $date-format-name as xs:string) as xs:string?

format-time($value as xs:time?, $picture as xs:string) as xs:string?

Die Funktionen format-dateTime, format-date und format-time formatieren $value als String, wobei sie den Picture-String verwenden, der durch das Argument $picture festgelegt wird, und das Datumsformat, das durch das Argument $date-format-name genannt wurde. Gibt es kein $date-format-name-Argument, dann wird das vorgegebene Datumsformat benutzt. Das Ergebnis der Funktion ist die formatierte Stringrepräsentation der gelieferten Werte dateTime, date oder time.

Die drei Funktionen format-dateTime, format-date und format-time werden zusammen als Datumsformatierungsfunktionen bezeichnet.

Es ist ein dynamischer Fehler, wenn der Name, der als $date-format-name-Argument angegeben ist, kein gültiger QName ist oder wenn sein Präfix nicht in einer Namensraumdeklaration deklariert ist oder wenn das Stylesheet keine Deklaration eines date-format mit einem passenden expanded-QName enthält. Der Prozessor muss entweder den Fehler signalisieren, oder er muss weitermachen, indem er das Argument $date-format-name ignoriert. Wenn der Prozessor in der Lage ist, den Fehler statisch zu entdecken (falls zum Beispiel das Argument als String-Literal angegeben wird), dann kann der Prozessor ihn optional als statischen Fehler kennzeichnen.

Wenn $value eine leere Sequenz ist, dann wird die leere Sequenz zurückgegeben.

Die date-format-Deklaration

<!-- Kategorie: Deklaration -->
<xsl:date-format name = qname 
                 language = nmtoken 
                 calendar = qname />

Das Element xsl:date-format deklariert ein Datumsformat, das Informationen bereitstellt, die von den Datumsformatierungsfunktionen verwendet werden. Gibt es ein name-Attribut, dann deklariert das Element ein benanntes Datumsformat, ansonsten deklariert es das vorgegebene Datumsformat. Der Wert des Attributs name ist ein QName. Es ist ein statischer Fehler, entweder das vorgegebene date-format oder ein Datumsformat mit einem bestimmten Namen mehr als einmal zu deklarieren (selbst mit unterschiedlicher Importpräzedenz), es sei denn, es wird jedes Mal mit demselben Wert für alle Attribute deklariert (wobei Vorgabewerte beachtet werden). Wenn ein Stylesheet keine Deklaration des vorgegebenen Datumsformats enthält, wird implizit ein deklaratives Äquivalent zu einem xsl:date-format-Element ohne Attribute angenommen.

Das Attribut language gibt die Sprache an, die für den Ergebnisstring der Funktion format-date verwendet werden soll. Der effektive Wert des Attributs muss ein Wert sein, der für das Attribut xml:lang gültig wäre. Wenn das language-Attribut weggelassen wird, dann wird die Vorgabe über die Implementierung definiert.

Die Sprache wird verwendet, um passende sprachabhängige Formen auszuwählen:

  • Namen (zum Beispiel von Monaten)
  • Ordinalformen von Zahlen
  • Stundenkonventionen (0–23 oder 1–24, 0–11 oder 1–12)
  • Erster Tag der Woche, erste Woche des Jahres

Welche Sprachen unterstützt werden, hängt von der Implementierung ab.

Das Attribut calendar legt fest, dass dateTime, date oder time, die im Argument $value angegeben werden, in einen Wert in diesem Kalender konvertiert und anschließend mit Hilfe der Konventionen dieses Kalenders in einen String umgewandelt werden müssen.

Ein Kalenderwert muss ein gültiger QName sein. Wenn der QName kein Präfix besitzt, dann identifiziert er den Kalender mit dem unten angegebenen Bezeichner. Besitzt QName ein Präfix, dann wird der QName zu einem expanded-QName erweitert. Der expanded-QName identifiziert den Kalender; das Verhalten wird in diesem Fall nicht durch dieses Dokument bestimmt.

Wird das calendar-Attribut weggelassen, dann wird ein lokalisierungsspezifischer Wert verwendet.

Es handelt sich um einen statischen Fehler, wenn eine Implementierung nicht die Sprache unterstützt, die im Attribut language angegeben ist, oder den Kalender, der im Attribut calendar festgelegt wurde, oder die Kombination aus den beiden. Der Prozessor muss entweder den Fehler signalisieren oder weitermachen, indem er einen lokalisierungsspezifischen Wert der beiden Attribute anstelle der angegebenen Werte verwendet. Wird ein anderer Kalender als der verlangte benutzt, dann muss der Name dieses Kalenders in den Ergebnisstring eingefügt werden.

Anmerkung:
Die Kalender, die als Nächstes aufgeführt werden, waren zumindest während der letzten einhundert Jahre im Gebrauch. In der Vergangenheit wurden noch viele andere Kalender benutzt, und in vielen Fällen können diese ohne zusätzliche Parameter nicht vollständig unterstützt werden. Solche Parameter könnten mit Hilfe von weiteren Attributen für das Element xsl:date-format, denen ein Namensraum als Präfix vorangestellt ist, definiert werden; allerdings werden die Semantiken solcher Attribute nicht durch diese Spezifikation definiert.
Diese Spezifikation definiert keinen dieser Kalender oder die Art und Weise, wie diese auf den Wertebereich des xs:date-Datentyps in XML Schema abgebildet werden. Es gibt nur eine ungefähre Äquivalenz zwischen Daten, die mit Hilfe unterschiedlicher Kalender aufgezeichnet wurden. Beispielsweise ist der Beginn eines neuen Tages in unterschiedlichen Kalendern nicht zeitgleich. Er kann sich auch geografisch unterscheiden. Implementierungen, die außer dem gregorianischen noch andere Kalender unterstützen, könnten daher unterschiedliche Ergebnisse liefern.

BezeichnerKalender
ADAnno Domini (christliche Ära)
AHAnno Hegirae (mohammedanische Ära)
AMEMauludi-Ära (Sonnenjahre seit Mohammeds Geburt)
AMAnno Mundi (jüdischer Kalender)
APAnno Persici
ASAji-Saka-Ära (Java)
BEBuddhistische Ära
CBCooch-Behar-Ära
CECommon Era
CLChinesische Mond-Ära
CSChula-Sakarat-Ära
EEÄthiopische Ära
FEFasli-Ära
ISOISO-8601-Kalender
JEJapanischer Kalender
KEKhalsa-Ära (Sikh-Kalender)
KYKali Yuga
MEMalabar-Ära
MSMonarchische Sonnen-Ära
NSNepal-Samwat-Ära
OSOld Style (julianischer Kalender)
RSRattanakosin-(Bangkok-)Ära
SESaka-Ära
SHMohammedanische Sonnen-Ära (Iran)
SSSaka Samvat
TETripurabda-Ära
VEVikrama-Ära
VSVikrama-Samvat-Ära

Wenigstens einer der genannten Kalender muss unterstützt werden. Um welchen es sich konkret handelt, wird durch die Implementierung definiert.

Der ISO-8601-Kalender, der in der vorhergehenden Liste vorhanden ist und mit ISO bezeichnet wird, ist im Prinzip derselbe wie der mit AD bezeichnete gregorianische Kalender, allerdings schreibt er die Verwendung bestimmter Nummerierungskonventionen vor, die in ISO 8601 definiert sind, anstatt sie auf der Grundlage der Sprache zu lokalisieren. Insbesondere sind im ISO-Kalender die Tage der Woche von 1 (Montag) bis 7 (Sonntag) nummeriert, Woche 1 in jedem Kalenderjahr ist die Woche (von Montag bis Sonntag), in der der erste Donnerstag dieses Jahres enthalten ist. Die numerischen Werte der Komponenten Jahr, Monat, Tag, Stunde, Minuten und Sekunden sind in diesem Kalender die gleichen wie die Werte, die in der lexikalischen Repräsentation von Datum und Uhrzeit verwendet werden, wie sie XML Schema definiert. Der ISO-Kalender ist vor allem für Anwendungen gedacht, die Datum und Uhrzeit in Formaten erzeugen müssen, die von anderen Programmen anstelle von menschlichen Benutzern gelesen werden sollen.

Anmerkung:
Der Wertebereich der Datentypen für Datum und Uhrzeit, der in XML Schema definiert wird, basiert auf absoluten Punkten in der Zeit. Der lexikalische Bereich dieser Datentypen definiert eine Repräsentation dieser absoluten Punkte in der Zeit mit Hilfe des proleptischen gregorianischen Kalenders – das bedeutet, dass der moderne westliche Kalender in die Vergangenheit und in die Zukunft extrapoliert wird, also die Daten historischer Ereignisse anhand des gregorianischen Kalenders neu berechnet werden – der Wertebereich dagegen ist kalenderneutral. Die Datumsformatierungsfunktionen erzeugen eine Repräsentation desselben absoluten Punktes in der Zeit, wie in einem möglicherweise anderen Kalender angegeben. Beispielsweise könnte das Datum, dessen lexikalische Repräsentation in XML Schema 1502-01-11 ist (der Tag, an dem Papst Gregor XIII. geboren wurde) mit Hilfe des julianischen (Old Style) Kalenders als 1 January 1502 formatiert werden. Dies spiegelt die Tatsache wider, dass es zu dieser Zeit eine Differenz von zehn Tagen zwischen den beiden Kalendern gab. Es wäre falsch und würde falsche Ergebnisse bringen, wenn man dieses Datum in einem Element oder Attribut des Typs xs:date als 1502-01-01 darstellen würde, auch wenn dies die Art und Weise widerspiegeln würde, wie das Datum in heutigen Dokumenten aufgezeichnet würde.

Der Picture-String

Der Picture-String besteht aus einer Sequenz aus Variablenmarken und literalen Teilstrings. Ein Teilstring, der in eckige Klammern eingeschlossen ist, wird als Variablenmarke interpretiert, Teilstrings, die nicht in eckige Klammern eingeschlossen sind, werden als literale Teilstrings betrachtet. Die literalen Teilstrings sind optional und werden bei Vorhandensein unverändert wiedergegeben, einschließlich aller Whitespace-Zeichen. Wenn innerhalb eines literalen Teilstrings eine öffnende oder schließende eckige Klammer benötigt wird, muss sie verdoppelt werden. Die Variablenmarken werden im Ergebnis durch Strings ersetzt, die Aspekte des Datums und/oder der Zeit repräsentieren, die formatiert werden sollen. Sie werden gleich genauer beschrieben.

Eine Variablenmarke besteht aus einem Komponentenspezifikator, optional gefolgt von einem oder zwei Darstellungsmodifikatoren und/oder optional von einem Längenmodifikator. Whitespace innerhalb einer Variablenmarke wird ignoriert.

Der Komponentenspezifikator kennzeichnet die Komponente des Datums oder der Uhrzeit, die erforderlich ist, und kann folgende Werte annehmen:

Spezifikator Bedeutung Vorgegebener Darstellungsmodifikator
Y Jahr 1
M Monat im Jahr 1
D Tag im Monat 1
d Tag im Jahr 1
F Tag der Woche n
W Woche im Jahr 1
w Woche im Monat 1
H Stunde im Tag (24 Stunden) 1
h Stunde im halben Tag (12 Stunden) 1
P a.m./p.m.-Markierung n
m Minute in der Stunde 1
s Sekunde in der Minute 1
f Bruchteil von Sekunden 1
Z Zeitzone als Zeitverschiebung von UTC oder, falls ein alphabetischer Modifikator vorhanden ist, der herkömmliche Name einer Zeitzone (etwa PST). 1
z Zeitzone als Zeitverschiebung, wobei GMT benutzt wird; zum Beispiel GMT+1. 1
C Kalender: Name oder Abkürzung eines Kalendernamens n
E Ära: Name einer Grundlage für die Nummerierung von Jahren, zum Beispiel die Regentschaft eines Monarchen n

Es ist ein dynamischer Fehler, wenn ein Komponentenspezifikator innerhalb des Picture-Strings auf Komponenten verweist, die in dem angegebenen $value nicht verfügbar sind oder die in dem gewählten Kalender nicht unterstützt werden. Dies ist ein behebbarer Fehler. Der Prozessor kann den Fehler signalisieren oder einfach weitermachen, indem er die unpassenden Komponentenspezifikatoren einfach ignoriert.

Der erste Darstellungsmodifikator kennzeichnet den Stil, in dem der Wert einer Komponente dargestellt werden soll, und nimmt folgende Werte an:

Modifikator Bedeutung
A Alphabetisch, Großbuchstaben
a Alphabetisch, Kleinbuchstaben (kann mit einem Großbuchstaben beginnen, wenn das in der Sprache so üblich ist)
N Name, Großbuchstaben
n Name, Kleinbuchstaben (kann mit einem Großbuchstaben beginnen, wenn das in der Sprache so üblich ist)
Ziffer 1 Dezimaldarstellung
i Kleingeschriebenes römisches Zahlzeichen
I Großgeschriebenes römisches Zahlzeichen

Jedes Zeichen, das den Dezimalziffernwert 1 hat (wie in der Unicode-Datenbank der Zeicheneigenschaften festgelegt), erzeugt mit Hilfe der passenden Menge an Unicode-Ziffern eine Dezimaldarstellung der Zahl.

Jedes andere Zeichen kann dazu verwendet werden, eine Nummerierungssequenz zu kennzeichnen, die mit diesem Zeichen beginnt, falls die Implementierung eine solche Nummerierungssequenz unterstützt.

Falls die Implementierung die Verwendung des angeforderten Darstellungsmodifikators nicht unterstützt, müssen Sie für diese Komponente den vorgegebenen Modifikator benutzen.

Ist der erste Darstellungsmodifikator vorhanden, kann ihm optional ein zweiter Darstellungsmodifikator folgen:

ModifikatorBedeutung
TTraditionelle Nummerierung. Hat die gleiche Bedeutung wie letter-value="traditional" in xsl:number.
OOrdinalform einer Zahl, etwa 3rd oder 8º.

Unabhängig davon, ob ein Darstellungsmodifikator vorhanden ist, kann ein Breitenmodifikator angegeben werden. Dieser legt die Anzahl der Zeichen oder Ziffern fest, die in die Darstellung des Wertes eingefügt werden können.

Der Breitenmodifikator hat folgende Form:

min-breite ("-" max-breite)?

wobei min-breite entweder ein vorzeichenloser Integer-Wert ist, der die minimale Anzahl der Zeichen festlegt, die ausgegeben werden, oder *, womit angezeigt wird, dass es kein ausdrückliches Minimum gibt. max-breite ist entweder ein vorzeichenloser Integer-Wert, der die maximale Anzahl der Zeichen festlegt, die ausgegeben werden, oder *, womit angezeigt wird, dass es kein ausdrückliches Maximum gibt. Wenn max-breite weggelassen wird, dann wird * angenommen. Beide Integer-Werte müssen, wenn sie vorhanden sind, größer als null sein.

Falls es keinen Breitenmodifikator gibt, dann werden bei der Ausgabe so viele Zeichen verwendet, wie erforderlich sind, um den Wert der Komponenten ohne Abschneiden und ohne Auffüllen darzustellen: Dies wird als vollständige Darstellung des Wertes bezeichnet.

Wenn die vollständige Darstellung des Wertes die angegebene maximale Breite überschreitet, sollte der Prozessor versuchen, eine alternative, kürzere Darstellung zu verwenden, die in die maximale Breite hineinpasst. Ist der Darstellungsmodifikator n oder N, wird dies durch das Abkürzen des Namens erreicht, indem entweder herkömmliche Abkürzungen verwendet werden, falls es solche gibt, oder indem andernfalls einfach rechts etwas abgeschnitten wird. Wird zum Beispiel max-breite auf 4 gesetzt, dann bedeutet dies, dass Abkürzungen von vier Buchstaben Länge benutzt werden sollten, obwohl es auch akzeptabel ist, wenn eine dreibuchstabige Abkürzung verwendet wird, falls eine solche gebräuchlich ist. (So könnte etwa »Tuesday« auf »Tues« abgekürzt werden und »Friday« auf »Fri«.) Im Fall der Jahreskomponente wird durch das Setzen von max-breite das Weglassen der höherwertigen Ziffern aus dem Jahr erreicht. Wird zum Beispiel max-breite auf 2 gesetzt, dann wird das Jahr 2003 als 03 ausgegeben. Gibt es jedoch keinen Mechanismus, um den Wert in die angegebene maximale Breite einzupassen (etwa wenn römische Zahlen verwendet werden), dann sollte der Wert in seiner vollständigen Darstellung ausgegeben werden.

Ist die vollständige Darstellung kürzer als die angegebene minimale Breite, dann soll der Prozessor den Wert auf die angegebene Breite auffüllen. Bei einer Dezimaldarstellung von Zahlen wird dies erledigt, indem Nullen aus dem entsprechenden Satz der Ziffernzeichen vorangestellt werden. In anderen Fällen sollten Leerzeichen vorangestellt werden.

Die Wahl der Namen und Abkürzungen, die in einer bestimmten Sprache verwendet werden, werden von der Implementierung definiert. Zum Beispiel könnte eine Implementierung July als Jul abkürzen, während eine andere Jly benutzt. Auf Deutsch könnte eine Implementierung den Sonnabend als Samstag bezeichnen, während eine andere ihn Sonnabend nennt. Die Implementierungen bieten möglicherweise Mechanismen, die es den Benutzern erlauben, solche Wahlmöglichkeiten zu steuern.

Die folgenden Beispiele zeigen eine Auswahl an Daten und Uhrzeiten und die Art und Weise, wie sie formatiert werden könnten. Diese Beispiele setzen die Verwendung des gregorianischen Kalenders voraus und nehmen an, dass der Name der xsl:date-format-Deklarationen im Stylesheet identisch ist mit dem Wert des Attributs language (zum Beispiel <date-format name="sv" language="sv"/>).

Erforderliche Ausgabe Ausdruck
2002-12-31 format-date($d,"[Y]-[M]-[D]")
12-31-2002 format-date($d,"[M]-[D]-[Y]")
31-12-2002 format-date($d,"[D]-[M]-[Y]")
31 XII 2002 format-date($d,"[D1] [MI] [Y]")
31st December, 2002 format-date($d,"[Do] [Mn], [Y]", "en")
31 DEC 2002 format-date($d,"[D] [MN,*-3] [Y]", "en")
December 31, 2002 format-date($d,"[Mn] [D], [Y]", "en")
31 Dezember, 2002 format-date($d,"[D] [Mn], [Y]", "de")
Tisdag 31 December 2002 format-date($d,"[Fn] [D] [Mn] [Y]", "sv")
[2003-04-07] format-date($t,"[[[Y]-[M]-[D]]]")
3:58 PM format-time($t,"[h]:[m] [PN]", "en")
3:58:45 pm format-time($t,"[h]:[m]:[s] [Pn]", "en")
3:58:45 PM PDT format-time($t,"[h]:[m]:[s] [PN] [ZN,*-3]", "en")
3:58:45 o'clock PM PDT format-time($t,"[h]:[m]:[s] o'clock [PN] [ZN,*-3]", "en")
15:58 format-time($t,"[H]:[m]")
15:58:45 format-time($t,"[H]:[m]:[s]")
15:58:45 GMT+02:00 format-time($t,"[H]:[m]:[s] [z]", "en")
15.58 Uhr GMT+02:00 format-time($t,"[H]:[m]:[s] Uhr [z]", "de")

Die folgenden Beispiele verwenden andere Kalender als den gregorianischen:

<!-- Beispiel: Thai -->
<xsl:date-format name="modern_Thai" language="th" calendar="BE"/>
format-date($d, "[D&#x0E51;] [Mn] [Y&#x0E51;]", "modern_Thai")
<!-- Ergebnis:  ๓๑ ธันวาคม ๒๕๕๕ -->

<!--Beispiel: Islamisch-->
<xsl:date-format name="Islamic" language="ar" calendar="AH"/>
format-date($d, "[D&#x0661;] [Mn] [Y&#x0661;]", "Islamic")
<!-- Ergebnis:  ١٤٣٣ تمو׳ال  ٢٦   -->

<!--Beispiel: Jüdisch-->
<xsl:date-format name="Jewish" language="he" calendar="AM"/>
format-date($d, "[D] [Mn] [Y]", "Jewish")
<!--Ergebnis: 26 ‏ט‎‏ב‎‏‏ת‎ 5763 -->
Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2006 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT Kochbuch" 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.

O'Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de