Bedingte XPath Constraints

Februar 26, 2020 0 Von Andreas

XPath ist eine nützliche Sache. Zugegeben, wenn man aus einer SQL Welt kommt ist XPath anfangs etwas gewöhnungsbedürftig. Die Betrachtungsweise ist eine etwas andere als man es von SQL her kennt. Dennoch sind XPath Retrieves in Mendix sehr mächtig.

Wenn man anfängt mit XPath Ausdrücken zu arbeiten kann es vorkommen, dass einem das ganze recht statisch vorkommt. Dieser Artikel handelt davon wie man seine XPath ausdrücke dynamischer gestallten kann.

Will man bestimmte Teile eines XPath Constraints nur unter bestimmten Bedingungen ausführen oder hat man eine Bedingung die darüber entscheidet ob ein oder ein anderer XPath Constraint ausgeführt werden soll, so sieht die offensichtliche Lösung wie folgt aus.

Ein Split entscheidet welcher Retrieve ausgeführt werden soll

Das ganze funktioniert auch wunderbar, hat allerdings auch gewisse Nachteile. Wenn man mehr als eine Bedingung hat kann sich hier schnell eine recht unübersichtliche Baumstruktur auffächern. Außerdem lassen sich die von den Retrieves ausgehenden Prozesse nicht mehr ohne weiteres vereinen. Tut man das, kann man im folgenden Verlauf die Ergebnisliste nicht mehr verwenden.

Eine Mögliche Lösung hierfür wäre die Retrieves und die Splits in einen Submicroflow auszulagern. Das ist in vielen Situationen auch eine gute Wahl. Alternativ kann man jedoch auch seine Bedingung innerhalb des XPath Ausdrucks platzieren. Das ganze sieht dann folgendermaßen aus.

Ein einzelner Retrieve. Die Bedingung wird im XPath verarbeitet.
Nur der Teil für den die Bedingung erfüllt ist wird ausgeführt.

In diesem Beispiel sollen bedingt durch die Condition alle Entity Objekte retrieved werden für die ein Wert größer oder gleich 0 beziehungsweise kleiner als 0 ist. Dies ist ein sehr einfaches Beispiel was sich beliebig komplex erweitern lässt.

Der Hintergrund ist, dass ein XPath Constraint einen Booleschen Ausdruck darstellt. Jedes Objekt für das der Asudruck wahr ist wird Teil der Ergebnismenge. Hierzu können aber nicht nur Eigenschaften des Objektes selbst verwendet werden, sondern auch Ausdrücke die auf Variablen und Attributen basieren die zu diesem Zeitpunkt dem Microflow zur Verfügung stehen. Diese „externen“ Ausdrücke stellen die Schalter dar mit denen die einzelnen XPath Bestandteile an bzw. aus geschaltet werden. Mit „and“ werden die XPath Bestandteile an eine Bedingung geknüpft und mit „or“ werden die einzelnen Bedingungen miteinander Verbunden.

Dies ist sicher kein Allheilmittel, kann aber in vielen Situationen sehr nützlich sein.

Viel Spaß beim Nachbauen.