Konstruktion von Datums-, Zeit- und Zeitstempelwerten

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

In XPath 2.0 und somit in XSLT 2.0 findet kein implizites Typecasting statt. Soll mit einem Wert gearbeitet werden. muss der Stylesheetautor dafür sorgen, dass er für die gewünschte Operation den erforderlichen Typ besitzt. So ist beispielsweise eine Differenzbildung zwischen zwei Datumswerten möglich – das Ergebnis ist ein Zeitdauerwert xs:duration oder vergleichbar. Es kann einfach der Operator »-« eingesetzt werden – dieser erwartet allerdings von Haus aus numerische Typen und erzeugt nur dann einen Zeitdauerwert, wenn beide Operanden den Typ xs:date (oder einen vergleichbaren Typ) besitzen.

Versucht man zwei Zeichenketten, auch wenn diese syntaktisch Datumswerten gleichen, entsprechend zu verarbeiten, so ist ein Fehler die Folge – eine automatische Typ­umwandlung erfolgt nicht. Dies hier geht nicht:

<xsl:variable name="datum_1" select="'2007-01-01'"/>
<xsl:variable name="datum_2" select="'2007-07-01'"/>

<!-- Achtung: Fehler!!! -->
Zeitabstand: <xsl:value-of select="$datum_2 - datum_1"/>

Sie erhalten die Fehlermeldung »Arithmetic operator is not defined for arguments of types (xs:string, xs:string)« – klar, Zeichenketten lassen sich nicht sinnvoll voneinander subtrahieren. Es ist also ein Typecasting erforderlich, oder aber die vorhergehende Konstruktion des erforderlichen Datentyps.

Die Konstruktion eines Typs benötigt eine Konstruktorfunktion, die einen Eingabewert entgegennimmt. Der Name der Konstruktorfunktion entspricht praktischerweise dem ihres XML-Schema-Typs, also xs:date() für Datumswerte vom Typ xs:date. Die Variable selbst kann als Eingangswert dienen – die Konstruktion erfolgt in diesem Fall während der Ausgabe:

<xsl:value-of select="xs:date($datum_2)-xs:date($datum_1)"/>

Code-Beispiel: kap03/3.05/date.xsl (Auszug).

Gleichermaßen könnte man die Konstruktion auch bereits beim Deklarieren der Variablen vornehmen:

<xsl:variable name="datum_1" select="xs:date('2007-01-01')"/>
  

Code-Beispiel: kap03/3.05/date.xsl (Auszug).

Ein Typecasting erfolgt hingegen etwas umständlicher mit dem Operator cast as. Folgendes führt in der Tat ebenfalls zum Erfolg:

$datum_2 cast as xs:date - $datum_1 cast as xs:date

Der Rückgabewert ist ein Zeitdauerwert P181D, was der Differenz der beiden Datumswerte in Tagen entspricht. Vorteil dieser Methode ist, dass im Vorfeld eine Prüfung möglich ist, ob ein Typecasting erfolgen kann. Hierzu dient die Prüfanweisung castable as:

if ($datum_3 castable as xs:date)
  then($datum_3 cast as xs:date)
  else(fn:error(err:konvertierungsfehler,'Casting nicht möglich'))

Code-Beispiel: kap03/3.05/date.xsl (Auszug).

Ist der Wert in $datum_3 nicht konvertierbar, so wird mittels fn:error() eine Fehlermeldung an SystemOut abgesetzt – die Verarbeitung bricht allerdings ergebnislos ab!

<xsl:variable name="datum_3" select="'Hahaha'"/>
  

Speichert man in $datum_3 einen nicht konvertierbaren String (wie in diesem Falle), dann meldet Saxon folgendes:

FOER0000: Casting nicht möglich
net.sf.saxon.trans.DynamicError: Casting nicht möglich

Hierbei steht FOER0000 für »unidentifizierbarer Fehler«. Als erstes Argument nimmt die Funktion fn:error() einen QName entgegen, der den Fehler identifizieren soll. In diesem Fall ist der QName den System unbekannt – es gibt jedoch den gewünschten Meldungsstring aus. Für den Fehler-QName wurde der XPath-Fehlernamensraum "http://www.w3.org/2005/xqt-errors" und das Präfix err verwendet.

   

<< zurück vor >>
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