Das erweiterte Typsystem von XPath 2.0 bewältigen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Die strengeren Typregeln von XPath 2.0 führen dazu, dass Sie das W3C verfluchen und nach Perl lechzen.

Lösung

Die meisten Inkompatibilitäten zwischen XPath/XSLT 1.0 und 2.0 resultieren aus Typfehlern. Dies gilt unabhängig davon, ob es ein Schema gibt oder nicht. Sie können viele Probleme, die bei der Portierung von überkommenem XSLT 1.0 nach XSLT 2.0 hinsichtlich der XPath-Unterschiede auftreten, eliminieren, indem Sie den 1.0-Kompatibilitätsmodus verwenden.

<xsl:stylesheet version="1.0"> 
  <!-- ... -->    
</xsl:stylesheet>

Meiner Meinung nach hören Sie irgendwann damit auf, den Kompatibilitätsmodus zu benutzen. XPath 2.0 bietet verschiedene Möglichkeiten, mit Typkonvertierungen umzugehen. Erstens können Sie Konvertierungsfunktionen explizit einsetzen:

(: Konvertieren des ersten X-Kinds des Kontexts in eine Zahl. :)

number(X[1]) + 17

(: Konvertieren einer Zahl in $n in einen String. :)

concat("id-", string($n))

XPath 2.0 hält darüber hinaus Typkonstruktoren bereit, sodass Sie die Interpretation eines Strings ausdrücklich steuern können:

(: Konstruktion eines Datums aus einem String. :)

xs:date("2005-06-01")

(: Konstruktion von Doubles aus Strings. :)

xs:double("1.1e8") + xs:double("23000")

Schließlich besitzt XPath die Operatoren castable as, cast as und treat as. Meist werden Sie die ersten beiden einsetzen.

if ($x castable as xs:date) then $x cast as xs:date else xs:date("1970-01-01")

Der Operator treat as ist an sich keine Konvertierung, sondern eher eine Versicherung, mit der Sie dem XPath-Prozessor versprechen, dass ein Wert zur Laufzeit von einem bestimmten Typ ist. Stellt es sich dann heraus, dass dies nicht der Fall ist, tritt ein Typfehler auf. XPath 2.0 wurde um treat as erweitert, damit XPath-Implementierer neben einer dynamischen Typüberprüfung eine statische Typüberprüfung (zum Zeitpunkt der Kompilierung) durchführen können, während es Programmierern erlaubt ist, statische Typtests selektiv zu deaktivieren. XSLT 2.0-Implementierungen mit statischer Typüberprüfung werden wahrscheinlich selten vorkommen, sodass Sie treat as einstweilen ignorieren können. Es ist wahrscheinlicher, dass sie in gehobeneren XQuery-Prozessoren auftreten, die statische Typüberprüfungen durchführen, um verschiedene Optimierungen zu ermöglichen.

Diskussion

Die Ausführung des 1.0-Kompatibilitätsmodus mit einem XSLT 2.0-Prozessor bedeutet nicht, dass Sie keine der neuen 2.0-Funktionen benutzen können. Dieser Modus aktiviert einfach bestimmte XPath 1.0-Konvertierungsregeln.

  • Er erlaubt die Verwendung nicht-numerischer Typen in einem Kontext, in dem Zahlen normalerweise automatisch über eine Atomisierung, gefolgt von der Anwendung der Funktion number(), konvertiert werden.

    (: Im Kompatibilitätsmodus wird der folgende Ausdruck zu 18.1 ausgewertet, in 2.0 ist es jedoch ein Typfehler. :)

    "1.1" + "17"

  • Er erlaubt die Verwendung von Nicht-String-Typen in einem Kontext, in dem Strings normalerweise automatisch über eine Atomisierung, gefolgt von der Anwendung der Funktion string(), in Strings konvertiert werden.

    (: Im Kompatibilitätsmodus wird der folgende Ausdruck zu 2 ausgewertet, in 2.0 ist es jedoch ein Typfehler. :)

    string-length(1 + 2 + 3 + 4 + 5)

  • Er verwirft automatisch Objekte aus Sequenzen der Länge 2 oder mehr, die in einem Kontext verwendet werden, in dem eine einelementige Menge erwartet wird. Dies geschieht oft, wenn das Ergebnis eines Pfadausdrucks an eine Funktion übergeben wird.
<poem>
  <line>In einem Sägewerk an der Peene</line>
  <line>da sägte ein Mann ganz alleene.</line>
  <line>An der Wand stand gedruckt</line>
  <line>"Meine Hand für`s Produkt."</line>
  <line>Da lag se ooch schon mang de Späne!</line>
</poem>

    (: Im Kompatibilitätsmodus werden beide Ausdrücke zu 30 ausgewertet, in 2.0 liefert der erste Ausdruck jedoch einen Typfehler. :)

    string-length(/poem/line)

    string-length(/poem/line[1])

  

<< 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