Datums- und Zeitangaben

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

"Does anyone really know what time it is? Does anyone really care?"
Chicago

Einleitung

Natives XSLT 1.0 weiß nicht, wie spät es ist, und scheint sich auch nicht darum zu kümmern. Datums- und Zeitangaben sind jedoch ein notwendiger Aspekt des täglichen Lebens. Die Notwendigkeit, sie zu manipulieren, wächst in der Computerwelt stetig, vor allem bei der Web-Entwicklung. Es war daher überraschend und bedauerlich festzustellen, dass Standard-XSLT 1.0 keine integrierte Unterstützung für Datum und Uhrzeit besitzt.

In XSLT 2.0 hat sich die Lage deutlich verbessert. XPath 2.0 verfügt über zahlreiche Funktionen zum Manipulieren von Datums-, Uhrzeit- und Zeitdauerangaben. Um genau zu sein, sind Funktionen mit kürzeren Namen das Einzige, was 2.0 in Bezug auf Datum und Uhrzeit noch zu wünschen übrig lässt! Mir wurde gesagt, Namen wie subtract-dates-yielding-yearMonthDuration( ) wurden zum Teil deshalb vergeben, um XQuery-Datenbank-Freaks zufrieden zu stellen. Der Wechsel zwischen Bindestrichen und dem Wechsel aus Groß- und Kleinschreibung stammt aus den abweichenden Konventionen, die von den XPath- und XML-Schema-Komitees angewandt wurden.

Die Beispiele in diesem Kapitel können dabei helfen, die fehlende Unterstützung für Datums- und Zeitangaben in XSLT 1.0 zu kompensieren. Leider kann eine der wichtigsten Funktionen nicht in XSLT 1.0 implementiert werden – das Beziehen des aktuellen Datums und der aktuellen Uhrzeit. Dafür müssen Sie auf eine andere Sprache zurückgreifen, deren Bibliothek die Interaktion mit der Echtzeituhr der Hardware unterstützt. Sowohl Java als auch JavaScript besitzen diese Fähigkeit. Falls Ihre Anwendung lediglich Datums- und Zeitangaben formatieren muss, die bereits in einem Dokument existieren, dann sollten die hier gezeigten Routinen den meisten Anforderungen genügen. In 2.0 benutzen Sie current-date( ), current-time( ) und current-dateTime( ).

Die Manipulation und Konvertierung von Datums- und Zeitangaben ohne spracheigene Unterstützung kann kompliziert sein. Wenn man es genau nimmt, handelt es sich aber auch nur um eine Übung in verzwickter Integer-Arithmetik, bei der im Prinzip einfache Konvertierungen in einem System mit gemischten Basen durchgeführt werden. Das Arbeiten mit anderen als dem gregorianischen Kalender und das Ermitteln von Feiertagen erfordert eine gewisse Kenntnis historischer, religiöser und kultureller Gegebenheiten. Leser, die keine Anwendung für Datums- und Uhrzeitroutinen sehen, werden dieses Kapitel vermutlich einfach überspringen, da nur ein geringer Teil der XSLT-Technik bei diesen Algorithmen einmalig ist. Alle, die sich für die Theorie hinter diesen Berechnungen interessieren, sollten sich auf jeden Fall die Artikel anschauen, die im Siehe auch-Abschnitt genannt werden.

Ich danke Jason Diamond dafür, dass er großzügigerweise viele der Templates beigesteuert hat, die sich mit der gregorianischen Zeitrechnung befassen. Der XSLT-Code für den Umgang mit nicht-gregorianischen Kalendern wurde aus Edward M. Reingolds Public-Domain-Lisp-Implementierung adaptiert. Einige der Algorithmen wurden angepasst, damit sie sich besser in XSLT einfügen und auf die Grundlage stellen lassen, die durch Jasons Code gegeben wurde.

Lassen Sie sich nicht durch die Technik verwirren, die in den meisten Templates verwendet wird, um die Zeit zu übergeben. Sie ist für maximale Bequemlichkeit gedacht. Sie können das Datum auf zwei Weisen übergeben: indem Sie einen String verwenden, der anhand der ISO-Datum-Uhrzeit-Regeln formatiert ist, und indem Sie individuelle Parameter für Jahr, Monat und Tag benutzen. Das folgende Beispiel sollte die Möglichkeiten verdeutlichen:

<xsl:call-template name="ckbk:calculate-day-of-the-week">
  <xsl:with-param name="date-time" select="'2002-01-01T01:00:00'"/>
</xsl:call-template>

<xsl:call-template name="ckbk:calculate-day-of-the-week">
  <xsl:with-param name="date" select="'2002-01-01'"/>
</xsl:call-template>

<xsl:call-template name="ckbk:calculate-day-of-the-week">
  <xsl:with-param name="year" select="2002"/>
  <xsl:with-param name="month" select="01"/>
  <xsl:with-param name="day" select="01"/>
</xsl:call-template>

Jeder der Aufrufe wertet den Wochentag für den 1. Januar 2002 aus. Die ersten beiden Varianten bieten sich an, wenn ein Datum bereits ISO-formatiert ist. Die letzte Variante ist günstig, wenn die Komponenten des Datums getrennt gespeichert werden. Sie können Teile eines ISO-Datumsstrings auch folgendermaßen überschreiben:

<xsl:call-template name="ckbk:calculate-day-of-the-week">
  <xsl:with-param name="date" select="'2002-01-01'"/>
  <xsl:with-parm name="day" select="25"/>
</xsl:call-template>

In allen Templates folgen die Daten dem gregorianischen Kalender, wenn nichts anderes angegeben ist. Dieses Kalendersystem wird im größten Teil der westlichen Welt benutzt.

Siehe auch

Jason Diamonds Original-XSLT-Implementierung finden Sie unter Date/Time Processing.

Ich gehe in diesem Kapitel nicht auf chinesische oder indische Kalender ein, da diese komplexer sind. Informationen über Berechnungen mit chinesischen und indischen Kalendern finden Sie unter The Mathematics of the Chinese Calendar bzw. unter The Indian Calendars.

EXSLT.org verfügt über ein Datum-Zeit-Modul, das nahezu die gleiche Funktionalität bereitstellt wie die gregorianischen Datum-Zeit-Templates, die in diesem Kapitel implementiert werden. Dort gibt es auch Templates für Zeitdauern (Differenzen zwischen Daten und Uhrzeiten).

XForms bietet eine gewisse Datum-Uhrzeit-Funktionalität. Es verwendet lexikalische XML Schema-(ISO-)Repräsentationen (wobei die Zeitdauern in die Richtungen dateTime und yearMonth unterteilt sind). Die neuen Funktionen sind: now( ), days-from-date( ), seconds-from-dateTime( ), seconds( ) und months( ).

  

  

<< zurück vor >>

 

 

 

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