LiveCycle ES est une formidable machine à manipuler les données XML. L'intérêt d'utiliser un standard comme XPath pour accéder à certaines valeurs est évident.
Mais la sémantique très restreinte de XPath ne permet pas a priori d'exécuter des instructions conditionnelles.
Dans mon cas, je voulais simplement afficher quelque chose du genre
Bonjour <titre>,
où le <titre> serait remplacé par Monsieur ou Madame en fonction d'une condition. Si en Java on aurait simplement écrit
"Bonjour " + ( condition ? "Monsieur" : "Madame" ) + ","
en XPath, une telle notation conditionnelle n'existe pas.
C'était sans compter sur l'astuce de certains qui on proposé la solution suivante.
Tout repose sur le fait qu'il existe une fonction number(<obj>) qui converti un <obj> en un nombre. Plus particulièrement, la valeur d'un booléen est 1 pour true et 0 pour false.
L'idée est d'alors utiliser substring() pour prendre tout ou rien de la chaîne de caractère en fonction de la condition. C'est-à-dire :
substring("Monsieur", 1, string-length("Monsieur") * number(condition))
donne "Monsieur" si la condition est vrai et la chaîne vide sinon.
La solution à mon problème devenait alors :
concat ( "Bonjour " , substring("Monsieur", 1, 8 * number(condition)) , substring("Madame", 1, 6 * number(!condition) , ",")
Pas très intuitif, mais ça a le mérite d'exister.