Arithmetische Ausdrücke
(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 4.)
Operatoren: +, –, * div, idiv, mod
Zur Formulierung arithmetischer Ausdrücke stellt XPath alle gängigen binären und unären Rechenoperatoren zur Verfügung. Unter einem arithmetischen Ausdruck versteht man die Verknüpfung zweier (auch bereits zusammengesetzter) XPath-Ausdrücke durch einen der oben genannten Operatoren.
Ergebnis eines arithmetischen Ausdrucks ist ein numerischer Wert (Typ numeric, also einer der in XPath definierten Zahlentypen).
Je nach Gattung der Operatoren unterscheidet man zwischen multiplikativen (Operatoren: *, div, idiv und mod) und additiven (Operatoren: +, -) Ausdrücken.
Unter den arithmetischen Operatoren gilt die Operatorpräzedenz, d.h., innerhalb eines arithmetischen Ausdrucks können zwei multiplikative Ausdrücke ohne weitere Klammersetzung zu einem additiven zusammengefasst werden (Punkt-vor-Strich-Regel):
ausdruck * ausdruck + ausdruck div ausdruck
Mittels Setzung runder Klammern können Teilausdrücke niedriger Präzedenz vorrangig ausgeführt werden:
ausdruck * (ausdruck + ausdruck) div ausdruck
Additive Ausdrücke
Die beiden Operatoren für additive Ausdrücke, also + und –, dienen wie üblich der Addition bzw. Subtraktion von Zahlenwerten. Handelt es sich bei den beiden Operanden um Zahlen unterschiedlichen Typs, so wird eine entsprechende Typ-Promotion eines der beiden Operanden vorgenommen. Der Ergebnistyp der Operation entspricht dem Typ beider Operanden im Anschluss an diese Typ-Promotion.
So wird bei der Addition einer Ganzzahl vom Typ xs:integer zu einer Fließkommazahl vom Typ xs:double der Integer-Wert zum Double aufgewertet. Das Ergebnis der Addition ist infolgedessen ebenfalls vom Typ xs:double.
Beim Subtraktionsoperator »-« ist zu beachten, dass das hierfür verwendete Zeichen (als Bindestrich) auch Teil eines Bezeichners sein darf. Soll der Bindestrich (hyphen) unmissverständlich als Operator interpretiert werden, so muss ihm ein Leerzeichen vorangehen (das ja bekanntlich nicht Teil eines Bezeichners sein kann). Nach dem Operator muss dagegen nicht unbedingt ein Leerzeichen folgen. Analoges gilt für das unäre Minuszeichen:
$summe-preis – $summe-rabatt
Achtung – Problem bei Weglassen des Leerzeichens
Ein Ausdruck wie »a-b« würde ohne trennende Leerzeichen als Bezeichner interpretiert, während »a – b«, da Leerzeichen nicht Teil eines Bezeichners sein können, unmissverständlich eine Rechenoperation darstellt.
Rückblick auf XPath 1.0
Die beiden additiven Operatoren von XPath 1.0 sind identisch mit denen von XPath 2.0, mit der Einschränkung, dass keine Typ-Promotion erfolgen muss, da XPath 1.0 mit dem allgemeinen Zahlentyp number arbeitet.
Multiplikative Ausdrücke
Operatoren für multiplikative Ausdrücke sind sowohl die beiden geläufigen für Multiplikation und Division als auch die für Ganzzahldivision und Modulo. Auch bei diesen Operatoren erfolgt kontextabhängig eine Typ-Promotion der Operanden.
Mittels des *-Operators werden zwei Zahlen miteinander multipliziert. Handelt es sich um Zahlen verschiedenen Typs, so wird eine Typ-Promotion zum jeweils höherwertigen Typ vorgenommen – ein Wert xs:integer wird zu xs:decimal, ein Wert xs:decimal zu xs:double. Das Ergebnis ist vom selben Typ, wie er nach der Promotion für beide Operanden vorliegt.
Für die Division steht in XPath nur der Operator div zur Verfügung. Der in anderen Programmiersprachen ebenfalls in dieser Bedeutung verwendete Operator »/« wird nur innerhalb von Pfadausdrücken bzw. als Ausdruck für den Dokumentknoten eingesetzt.
Der Typ des Ergebnisses hängt von den Typen der Operanden ab, wobei der Ergebnistyp auch bei zwei typengleichen Operanden nicht dem Eingangstyp entsprechen muss. So ergibt das Ergebnis der Division zweier Integerzahlen einen Wert xs:double. In anderen Fällen kann das Ergebnis, sofern die beiden Operanden verschiedenen Typs sind, nach entsprechender Typ-Promotion den gleichen Typ wie die Operanden besitzen.
div: -3 div 2 ergibt -1.5
Neu in XPath 2.0 ist der Operator idiv zur Ganzzahldivision. Der Defaulttyp für seine beiden Operanden ist xs:integer, das Ergebnis der Ganzzahldivision ist stets ebenfalls eine Ganzzahl, die gegebenenfalls gegen 0 gerundet wird (d.h., für positive Ergebnisse der Ganzzahldivision wird gemäß der Funktion fn:floor(), für negative gemäß der Funktion fn:ceiling() gerundet).
idiv: -3 idiv 2 ergibt -1
Auch die Modulo-Operation (Restwert) wird in XPath unterstützt – zur Formulierung dient der mod-Operator, hinter dem formal die Operatorfunktion op:numeric-mod() steht.
mod: 17 mod 3 ergibt 2
Rückblick auf XPath 1.0
In XPath 1.0 existiert kein Operator zur Ganzzahldivision. Ansonsten entsprechen die multiplikativen Operatoren denen von XPath 2.0, mit der Einschränkung, dass keine Typ-Promotion erfolgen muss, da XPath 1.0 mit dem allgemeinen Zahlentyp number arbeitet.
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema XPath 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