• Aucun résultat trouvé

4.3 Langage de transformation visuel à base de règles

4.3.2 Productions

La partie droite des règles de transformation VXT est appelée la production. Cette partie prend la forme d’une forêt XML qui représente les sous-arbres produits par le déclenchement de la règle. Il s’agit d’une séquence ordonnée d’arbres toujours représentés en utilisant notre variante des treemaps. Les composants de cette forêt sont agencés suivant un flot horizontal orienté de gauche à droite, ou vertical orienté de haut en bas. L’agencement horizontal est en théorie le meilleur puisqu’il est en accord avec la méthode de représentation standard, qui aligne horizontalement les nœuds frères (ce que sont les racines des sous-arbres composant la forêt). Cependant, d’un point de vue pratique, l’agencement vertical peut être intéressant pour la lisibilité de la règle si les sous-arbres ont une trop forte tendance à se développer horizontalement par eux-mêmes. Notons que les règles produisant assez souvent une forêt ne contenant qu’un seul arbre, ce problème est peu important.

Les arbres formant cette forêt correspondent à des fragments de la structure résultat et sont insérés dans celle-ci à chaque fois que la règle est déclenchée. L’insertion dans la structure cible se fait de manière similaire à XSLT (voir section 2.4.1), c’est-à-dire que les fragments produits par les instructions telles que xsl:apply−templates ou xsl:value−of remplacent, dans le fragment qui la contient, l’instruction qui les a engendrés. Les fragments sont composés de trois types de nœuds :

– les nœuds correspondant à de nouveaux éléments, attributs et textes produits dans le document ré-sultat. Ce sont les nœuds de couleur gris clair, toujours associés à une étiquette (label) représentant le nom de l’élément, de l’attribut, ou le début de la valeur des nœuds texte.

– les nœuds correspondant au résultat de la transformation de nœuds extraits du document source. Ces nœuds sont colorés avec le même bleu que celui utilisé pour les nœuds représentant les ins-tructions d’extraction des VPMEs. Ils ne sont pas labélisés puisqu’ils ne représentent que les

em-nouveau texte gris text texte obtenu par bleu

  transformation

de données source itération orange hachuré 



 

FIG. 4.9 : Représentation visuelle des types des nœuds de production

symbole type d’opération équivalent XSLT

application des règles xsl:apply-templates extraction des noeuds texte (character data) xsl:value-of

copie du nœud ou du sous-arbre xsl:copy, xsl:copy-of

FIG. 4.10 : Opérateurs de transformation VXT

placements où seront insérés les résultats des transformations appliquées aux nœuds extraits du document source.

– les structures de contrôle, comme les boucles itératives. Ces nœuds sont représentés par des rec-tangles hachurés pour bien les différencier des autres nœuds : il s’agit de structures de contrôle programmatiques qui ne feront pas elles-mêmes partie du résultat.

Le tableau de la figure 4.9 présente les différents types de nœuds pouvant apparaître dans la production.

Extraction et transformation de données du document source

Tous les nœuds appartenant à la deuxième catégorie sont reliés à exactement un nœud de la VPME en partie gauche de la règle par une opération de transformation. Il existe trois opérations principales qui peuvent être appliquées sur les données extraites de l’arbre source. Elles sont résumées dans le tableau de la figure 4.10 avec leur correspondance en XSLT. Nous ne présentons pas les équivalents Circus car ceux-ci n’existent pas en tant que tels. Circus est en effet un langage de plus bas niveau et les opérations de transformation se traduisent par des opérations de filtrage et de manipulation des structures qui n’ont pas de représentation abstraite.

Langage de transformation visuel à base de règles 97 Le lien, représenté par une ligne brisée attribuée d’une icône représentant le type d’opération à effec-tuer, permet d’associer un nœud extrait de l’arbre source à une opération de transformation à effectuer sur ces données et à un emplacement où mettre le résultat de cette transformation dans le fragment d’arbre produit par la règle. Seuls les nœuds bleus translucides de la VPME, qui représentent des instructions d’extraction, peuvent être reliés à la production. Des exemples de règles complètes contenant des liens sont détaillés dans la section suivante (figures 4.11 à 4.15). Les trois opérations de transformation sont définies pour tous les types de nœuds de l’arbre d’entrée, et produisent des résultats dont il est parfois possible d’inférer le type (texte, attribut, ou élément). Ainsi, le nœud identifiant dans la production l’em-placement où devra être inséré le résultat de l’opération de transformation associée se voit assigné une forme géométrique reflétant le type inféré8. Quand le type du résultat ne peut pas être inféré, le nœud est représenté par un cercle.

Identification des données à extraire

La correspondance entre la VPME et XSLT n’est pas directe, puisque là où (dans VXT) nous avons une seule expression pour spécifier le filtrage de la structure source, nous avons en XSLT une expression XPath pour la sélection du nœud contextuel et n expressions XPath pour les n instructions de trans-formation. Dans le cas de Circus, la correspondance est plus évidente, puisque comme nous l’avons vu précédemment ce langage offre aussi des primitives de filtrage qui permettent de spécifier dans la même expression conditions de sélection et données à extraire.

Les instructions d’extraction et de transformation génèrent des fragments du résultat à partir de don-nées extraites du document source. Ces dondon-nées sont identifiées par les nœuds bleus translucides des VPMEs. Leur position dans la structure est interprétée par rapport au nœud contextuel. Ces nœuds peuvent eux-mêmes contenir des nœuds au contour continu, qui représentent alors des prédicats portant sur la sélection des nœuds à extraire par l’instruction. Ainsi, dans la VPME de la figure 4.8, nous avons deux instructions d’extraction. La première sélectionne les éléments title fils d’éléments article et contenant obligatoirement un nœud texte (cette condition est symbolisée par la présence d’un lo-sange dans le nœud à extraire). Sa traduction XPath sera, en prenant pour origine le nœud contextuel, title[text()]. Toujours dans la figure 4.8, la deuxième instruction sélectionne les éléments section fils de article à la condition qu’ils contiennent au moins un élément para. La traduction XPath de ceci est section[para].

Note : à ce stade, la bordure continue ou discontinue des nœuds de la VPME n’a plus d’importance.

Nous nous occupons ici d’identifier les nœuds à extraire, et le fait qu’ils aient été ou non requis pour la sélection du nœud contextuel n’a pas de conséquence. Ainsi, tous les nœuds sont pris en compte dans la génération du chemin reliant le nœud contextuel au nœud à extraire, que leur bordure soit continue ou discontinue.

La traduction en XSLT des instructions d’extraction et transformation va donc consister à générer une instruction XSLT comme xsl: apply − templates qui sera placée dans le fragment de résultat à l’endroit indiqué par le nœud associé au lien (ligne brisée) dans la production. L’attribut select de cette

Les expressions XPath associées aux attributs select des instructions XSLT peuvent retourner un en-semble de nœuds (node-set) vérifiant les conditions exprimées. L’instruction de transformation est alors appliquée à tous les éléments de cet ensemble, le résultat étant intégré à l’arbre de sortie. La sémantique des instructions d’extraction VXT est la même. C’est-à-dire qu’un nœud bleu translucide identifiera et retournera potentiellement tout un ensemble de nœuds du document source qui seront transformés et pla-cés à l’endroit indiqué dans la production, dans l’ordre qui était le leur dans la structure source. Il s’agit là d’un premier mécanisme d’itération complètement invisible du point de vue de l’utilisateur. Il est par contre parfois nécessaire de rendre explicite le mécanisme d’itération, par exemple quand l’utilisateur veut produire des éléments additionnels pour chaque nœud de l’ensemble de départ. Il est alors néces-saire d’identifier quels sont les nœuds produits en plus du résultat de la transformation des nœuds source à chaque itération. En XSLT, ceci est réalisé par l’emploi de la structure de contrôle xsl : for − each qui itère sur l’ensemble des nœuds retournés par l’expression XPath de l’attribut select associé. Le contenu de cet élément xsl : for − each est alors produit à chaque itération. VXT utilise pour sa part un rectangle orange hachuré qui délimite ce qui est produit à chaque itération sur l’ensemble des nœuds retournés par l’instruction d’extraction de la VPME associée à l’unique nœud coloré (bleu) fils du rec-tangle représentant la boucle (voir le tableau de la figure 4.9 et l’exemple de règle de la figure 4.11). L’équivalent Circus utilise une construction programmatique récemment proposée dans le langage qui permet de s’affranchir des structures de contrôle génériques qu’il aurait autrement fallu utiliser. Elle est de la forme :

seq[f => e]

où seq identifie une séquence, f un filtre Circus et e une expression qui peut faire référence à des variables du filtre. Cette construction retourne une séquence, et sa sémantique est la suivante : f est appliqué à chaque élément de la séquence seq ; dans les cas où le filtre sélectionne l’élément, e est ajouté à la séquence retournée. Elle est utilisée plusieurs fois dans l’exemple de transformation de la section 4.3.3 dont le code Circus complet est donné en annexe A.

Le mécanisme d’itération VXT cache au maximum les structures de contrôle liées à l’itération sur un ensemble et aide ainsi à réduire la complexité de la transformation et de sa représentation visuelle. Ceci est rendu possible par le fait que VXT est un langage spécialisé dans un domaine bien précis, pour lequel il n’y a pas de réel besoin de mécanisme d’itération général ; contrairement à LabView, qui doit proposer des boucles génériques dont la représentation visuelle n’est pas du tout intuitive (voir section 3.4.2).

Langage de transformation visuel à base de règles 99 Notons que, dans le même esprit, l’opération de copie proposée par VXT est plus abstraite que ce que propose XSLT. Ce dernier offre en effet deux instructions : xsl:copy et xsl:copy − of. La pre-mière ne copie que le nœud courant, sans tenir compte de son contenu et de ses attributs, et permet l’ajout d’un nouveau contenu dans l’élément copié. Ce contenu peut être formé de nouveaux nœuds et d’appels à d’autres instructions comme xsl:apply − templates. Au contraire, la deuxième instruction (xsl : copy−of) copie l’intégralité du sous-arbre dont la racine est le nœud identifié par l’expression XPath associée et n’autorise pas l’insertion de nouveau contenu dans l’élément copié. La différence entre les deux instructions peut être assez subtile. Cependant, elles s’utilisent pour des raisons différentes, et il est possible de savoir quelle est l’instruction appropriée simplement en tenant compte des contraintes exprimées ci-dessus9. Ainsi, nous avons choisi dans VXT d’exploiter cette propriété pour ne proposer qu’une seule opération de copie plus abstraite qui sera traduite en XSLT soit par xsl:copy, soit par xsl: copy − ofsuivant les cas, de manière transparente pour l’utilisateur.