Wer einen Hintergrund in der Programmierung hat, ist Bedingungen gewöhnt, die Boolesche Variablen direkt bewerten. Leider gilt dies nicht für die Auswertung von Bedingungen der strukturierten Aktivität IF für die bedingte Verzweigung in der auf Oracle SOA Suite 11g basierten Implementierung von BPEL 2.0-Geschäftsprozessen. Lassen Sie uns zunächst einen Blick auf ein Java-Beispiel werfen.

boolean boolVar;
if(boolVar) {
  System.out.println("Condition evaluates to true. Input value was "+boolVar.toString());
} else {
  System.out.println("Condition evaluates to false. Input value was "+boolVar.toString());
}

Wenn der Wert einer Booleschen Variablen true(wahr) ist, wird die auf dieser Variable basierende Bedingung automatisch auf true gesetzt. Genauso wird die Bedingung einer Booleschen Variable mit einem falschen Wert auf false (falsch) gesetzt. Der BPEL 2.0-Engine von Oracle SOA Suite 11g arbeitet anders: In BPEL werden Boolesche Variablen vor der Zustandsbewertung in den String-Wert konvertiert. BPEL verwendet den XSLT-Funktionswert value-of. Das bedeutet, dass ein wahrer Boolescher Variablenwert “true” wird. Mit einer Bedingung, die nur auf der Booleschen Eingangsvariable basiert,

<condition>$inputVariable.payload/ns1:BooleanInput</condition>

erhalten wir einen String-Wert “true” oder “false” der nicht mit irgendetwas verglichen wird, weshalb die Bedingung als true bewertet wird.Wenn also der Wert unserer Booleschen Eingangsvariablen auf false eingestellt wird, wird unsere Bedingung true. Die richtige Antwort auf dieses Verhalten ist es, den binären Eingangswert mit dem gewünschten Textwert zu vergleichen, in den die Boolesche Eingangsvariable umgewandelt wird.

<condition>$inputVariable.payload/ns1:BooleanInput = 'true'</condition>

Auf die gleiche Weise vergleichen Sie Ihre Boolesche Eingabe mit false, wenn Sie die Boolesche Bedingung auf wahr bewerten möchten und der Eingabewert false ist.

<condition>$inputVariable.payload/ns1:BooleanInput = 'false'</condition>

Auf der anderen Seite ist es möglich, eine Bedingung direkt auf der Grundlage der XSLT-Funktion als true oder false zu bewerten, wenn es der einzige Parameter der Bedingung ist.

<condition>true()</condition>

… wird als true bewertet.

<condition>false()</condition>

… wird als false bewertet, daher wird der else-Zweig ausgewählt. Dies funktioniert jedoch nur, wenn die Boolesche Funktion der einzige Parameter der Bedingung ist. Wenn wir es in einer Auswertung gegen einen anderen Parameter verwenden, wird die String-Darstellung zum Vergleich verwendet. Die folgende Bedingung …

<condition>$inputVariable.payload/ns1:BooleanInput = true()</condition>

…ergibt den Stringwert der Booleschen Eingangsvariable “true” / “false”, die mit der String-Darstellung “true()” der XSLT-Funktion true() verglichen wird. Zwar gilt “true” != “true()”, die Bedingung wird aber als false (else-Zweig) bewertet, auch wenn wir das Gegenteil erwarten würden. Auf die gleiche Weise können Sie nicht die XSLT-Funktion true() respektive false() indirekt verwenden, um eine Bedingung über eine Variable als true oder false bewerten zu lassen.

<assign name="AssignTrue">
  <copy>
    <from>false()</from>
    <to>$inputVariable.payload/ns1:BooleanInput</to>
  </copy>
</assign>
<if name="TrueOrFalse">
  <documentation>
    <![CDATA[true]]>
  </documentation>
  <condition>$inputVariable.payload/ns1:BooleanInput</condition>

Beim Übergeben des Wertes der Booleschen Variable auf die Bedingung, wird ihre String-Darstellung zur Auswertung der Bedingung verwendet. Die folgende Tabelle fasst dieses Verhalten zusammen:

Tabelle 1: Bedingte Verzweigungsauswertung basierend auf Eingabe
Wert von $BooleanInput Variable Bedingung Auswertung einer Bedingung
true $BooleanInput true
false $BooleanInput true
true() true
false() false
true $BooleanInput = ‘true’ true
false $BooleanInput = ‘true’ false
true $BooleanInput = ‘false’ false
false $BooleanInput = ‘false’ true

Kurzum: Vergleichen Sie Boolesche Variablen mit ihrem Stringwert.