How to create an if-then-else expression (aka ternary operator) in an XPath 1.0 expression?

Lucas Jellema 6
0 0
Read Time:1 Minute, 17 Second

There are situations where I have to create an XPath expression that performs something like if-then-else logic (similar to a CASE or DECODE expression in SQL or a ternary operator in Java or JavaScript). Unfortunately, XPath 1.0 – a version still widely found – does not support the XPath 2.0 if-then-else logic. So something else is needed.

I encountered a great trick in a forum post; this post also referred to Becker’s Method. In short, the trick uses the fact that the numerical evaluation of (Boolean) true = 1 and of false = 0. It also makes use of the fact that substring( somestring, 1, 0) returns an empty string.

The abstract XPath expression used for

if C1 then R1 else R2

becomes

concat( substring( R1, 1,number (C1) * string-length(R1), substring( R2, 1, number(not(C1)) * string-length(R2)

when R1 and R2 are not of type string, then some type conversion to and from string are required.

An example of using this trick:

In a Mediator component I want to assign the value ‘LONG’ when the input string is longer than 6 characters. When the stringlength is 6 or less, then I want to assign the value not long.

With the ternary expression, this would be something like:

result = (input.length() > 6? ‘LONG’: ‘NOTLONG’)

The corresponding XPath expression is this:

concat(

  substring( ‘LONG’, 1, ( number(string-length($in.payload/client:process/client:input)  > 6)  * 4))

, substring( ‘NOTLONG’, 1, ( number(string-length($in.payload/client:process/client:input)   <=  6)  * 7))

)

image

About Post Author

Lucas Jellema

Lucas Jellema, active in IT (and with Oracle) since 1994. Oracle ACE Director and Oracle Developer Champion. Solution architect and developer on diverse areas including SQL, JavaScript, Kubernetes & Docker, Machine Learning, Java, SOA and microservices, events in various shapes and forms and many other things. Author of the Oracle Press book Oracle SOA Suite 12c Handbook. Frequent presenter on user groups and community events and conferences such as JavaOne, Oracle Code, CodeOne, NLJUG JFall and Oracle OpenWorld.
Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %

Average Rating

5 Star
0%
4 Star
0%
3 Star
0%
2 Star
0%
1 Star
0%

6 thoughts on “How to create an if-then-else expression (aka ternary operator) in an XPath 1.0 expression?

  1. Excellent trick ! Thanks for this great post. I always tent use xsl transform when I needed a ternary operation in my assign.

  2. Wow!! I wanted to separate emails by commas but i didn’t want the comma in the beginning, of course. Following your method i did this in my “for each” and it worked : substring(‘,’, 1, ($mailCounter > 1)). The condition returns 0 and a substring from one to zero returns empty so the comma is not added in the beginning. Great

    1. Hi Gabriel, thank you for your comment. It is nice to know that this was useful for you. Lucas

  3. Wow, this is realy great. I wished I knew this one years ago. There has been so many situations where I could have used this.

Comments are closed.

Next Post

SQL Challenge: Find World Cup Football matches with a comeback

As I recently said in another blog post, the World Cup Football is such a wonderful source of data that begs to be digested using SQL in many different ways. While working on a tag cloud producer – topic for a subsequent article – I ran into a special challenge. […]
%d bloggers like this: