Komplexe Logik mittels Quantifikatoren bezwingen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie müssen eine Sequenz auf das Vorhandensein einer Bedingung in einigen oder allen Objekten überprüfen.

Lösung

XPath 1.0

Wenn die Bedingung auf Gleichheit beruht, dann ist die Semantik der Operatoren = und!= in XPath 1.0 und 2.0 ausreichend.

(: Wahr, wenn wenigstens ein Abschnitt - section - referenziert wird. :)

//section/@id = //ref/@idref

(: Wahr, wenn alle section-Elemente von irgendeinem ref-Element referenziert werden. :)

count(//section) = count(//section[@id = //ref/@idref])

XPath 2.0

In XPath 2.0 verwenden Sie die Ausdrücke some und every, um die gleiche Wirkung zu erzielen.

(: Wahr, wenn wenigstens ein Abschnitt - section - referenziert wird. :)

some $id in //para/@id satisfies $id = //ref/@idref

(: Wahr, wenn alle section-Elemente von irgendeinem ref-Element referenziert werden. :)

every $id in //section/@id satisfies $id = //ref/@idref

Mit geringem Aufwand können Sie in XPath 2.0 sogar noch weiter gehen.

(: Es gibt einen Abschnitt, der jeden Abschnitt bis auf sich selbst referenziert. :)

some $s in //section satisfies every $id in //section[@id ne $s/@id]/@id satisfies $id = $s/ref/@idref

(: $sequenz2 ist eine Teilsequenz von $sequenz1 :)

count($sequenz2) <= count($sequenz1) and every $pos in 1 to count($sequenz1), $objekt1 in $sequenz1[$pos], $objekt2 in $sequenz2[$pos] satisfies $objekt1 = $objekt2

Wenn Sie den count-Test im vorhergehenden Ausdruck entfernen würden, würde bestätigt werden, dass zumindest die ersten count($sequenz1)-Objekte in $sequenz2 identisch mit den entsprechenden Objekten in $sequenz1 sind.

Diskussion

Die Semantiken von =, !=, <, >, <= und >= in XPath 1.0 und 2.0 überraschen die Uneingeweihten manchmal, wenn einer der Operanden eine Sequenz oder eine XPath 1.0-Knotenmenge ist. Dies liegt daran, dass die Operatoren zum Ergebnis »wahr« auswerten, wenn es wenigstens ein Wertepaar von jeder Seite des Ausdrucks gibt, das sich entsprechend der Relation verhält. In XPath 1.0 kann sich das manchmal zu Ihrem Vorteil auswirken, wie wir gezeigt haben; gelegentlich jedoch lässt es Sie an Sinn und Unsinn der Mathematik zweifeln. Beispielsweise könnte man davon ausgehen, dass $x = $x immer wahr ist. Falls $x jedoch die leere Sequenz ist, stimmt dies nicht! Dies folgt aus der Tatsache, dass Sie kein Paar aus Objekten innerhalb jeder leeren Sequenz finden können, das gleich ist.

  

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