David Naramski

Ingénieur Civil Informaticien

  • Increase font size
  • Default font size
  • Decrease font size

Conditional XPath 1.0

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.