Comme vous avez sans doute déjà pu le comprendre, le langage XML est le standard en ce qui concerne les échanges de messages entre les applications d’une architecture SOA. Les diverses applications du SI échangent donc des messages XML dont les formats peuvent varier selon les applications. Il est donc nécessaire de transformer les messages avant de les délivrer aux applications cibles. Pour cela, il existe un langage : eXtensible Stylesheet Language Transformations XSLT. Il s’agit d’un langage de transformation permettant de modifier la structure d’un message XML vers un autre message XML (voire d’autres formats : texte, etc.). BPEL, via l’activité Transform permet simplement au développeur d’intégrer des transformations XSL au sein de ses processus.
Je me propose, par cet article, de vous montrer comment mettre en place une transformation XSL dans un flux BPEL, comment exploiter les fonctionnalités de Jdeveloper autour des transformations XSL et comment contourner certaines restrictions du designer Jdeveloper pour mettre en place la communication entre BPEL et XSLT.
Ci-dessous, un exemple de schémas XSD différents décrivant une même entité. On peut donc imaginer un processus BPEL devant faire communiquer deux applications traitant des données sur des personnes dont les formats sont définis par les deux schémas XSD ci-dessous :
Si les structures XML sont composées de peu d’éléments, il est tout à fait possible d’utiliser des activités Assign permettant d’assigner nœud par nœud les différents éléments d’une variable, on aura alors autant de règles de copie qu’il y a de nœuds à assigner. On peut dire que pour les structures XML dépassant 5 éléments, cela devient très fastidieux … L’utilisation des transformations XSL devient alors indispensable !
Entrées / Sortie
Sur 10g, l’activité transform prend en entrée une variable XML et en sortie une autre variable XML. En revanche, la 11g offre la possibilité de faire une transformation XSL prenant en entrée plusieurs variables, ce qui peut s’avérer très pratique.
Tests
Une fois que vous avez défini les variables impliquées dans la transformation : entrées et sortie, il reste à présent à définir la transformation XSL qui va permettre de former le message XML de sortie de la transformation.
Une fois l’écran ci-dessus validé, Jdeveloper génère le fichier XSLT dans lequel vous allez définir la transformation. Vous avez alors deux possibilités : définir la transformation en mode design ou en mode source (cf. image ci-dessous).
Pour ma part, je préfère le mode design pour les transformations simples (mapping de données) ; en revanche, pour les transformations plus complexes (boucles, appel de template, etc.), je préfère le mode source.
Un outil utile disponible en 10g et 11g permet de tester directement dans jdeveloper votre transformation XSL. Pour cela, il suffit de faire un clic droit sur la transformation (zone centrale pour le mode design et peu importe l’endroit pour le mode source) et de cliquer sur « Test ».
Un fichier source est généré, vous pouvez y mettre les valeurs que vous souhaitez et un fichier cible est généré à partir de la source à laquelle la transformation XSL a été appliquée. Cet outil est vraiment très pratique puisqu’il permet de tester la transformation avant le déploiement du flux.
Passage de variables
Vous avez également la possibilité de passer des paramètres à vos transformations XSL depuis votre code BPEL. Pour cela, il faut créer une variable du type parameters dont le format est décrit par le schéma suivant :
<?xml version="1.0" encoding="UTF-8" ?> <schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://schemas.oracle.com/service/bpel/common" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.oracle.com/service/bpel/common"> <element name="parameters"> <complexType> <sequence> <element ref="tns:item" minOccurs="0" maxOccurs="unbounded"/> </sequence> </complexType> </element> <element name="item"> <complexType> <sequence> <element name="name" type="string"/> <element name="value" type="string"/> </sequence> </complexType> </element> </schema>
Cette variable contient des éléments du type item, chaque item est un couple nom/valeur que vous allez pouvoir récupérer dans la transformation XSL.
Une fois la variable de paramètres mise à jour, vous pouvez la passer en paramètres de la transformation XSL de la façon suivante (uniquement en mode source):
ora:processXSLT('./transformations/trfExemple.xsl', bpws:getVariableData('inputVariable','payload'), bpws:getVariableData('varParameters'))
La fonction processXSLT comporte trois arguments :
- L’emplacement du fichier de transformation
- La variable d’entrée
- La variable possédant les paramètres à passer à la transformation XSL
Enfin, pour récupérer les paramètres dans la transformation XSL :
<xsl:stylesheet version="1.0" xmlns:client="http://xmlns.oracle.com/Tuto/TutoXSL/TutoXSL" xmlns:ns0="http://xmlns.oracle.com/Personne2" ... > <xsl:param name="birthDate"/> <xsl:template match="/"> <ns0:nom> <xsl:value-of select="$birthDate "/> </ns0:nom> </xsl:template> </xsl:stylesheet>
Où birthDate est un le nom d’un item contenu dans la variable « varParameters ».
Attention : L’ajout d’une variable « paramètre » n’est pas supporté par le designer. Si vous ouvrez le designer, et que vous validez en appuyant sur OK, alors le paramètre disparaîtra dans le code BPEL, il vous faudra le rajouter à nouveau en mode source.
Conclusion
Cet article vous aura permis d’aborder les transformations XSL qu’il est possible de mettre en place dans vos flux BPEL. Nous avons abordé les concepts dfondamentaux, sachez qu’il est possible de mettre en place des traitements complexes à l’aide des nombreuses fonctions XSL disponibles.