Arithmetische Ausdrücke

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

Operatoren: +, –, * div, idiv, mod

Zur Formulierung arithmeti­scher Ausdrücke stellt XPath alle gängigen binären und unären Rechenoperato­ren 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., inner­halb 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 bei­den 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 Binde­strich (hyphen) unmissverständlich als Operator interpretiert werden, so muss ihm ein Leerzeichen vorangehen (das ja bekanntlich nicht Teil eines Bezeich­ners sein kann). Nach dem Operator muss dagegen nicht unbedingt ein Leer­zeichen 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änd­lich 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 Ope­rator »/« 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 For­mulierung 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 Ganz­zahldivision. 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