Ant : Automatiser l`exécution de transformations XSLT
Transcription
Ant : Automatiser l`exécution de transformations XSLT
Ingénierie Documentaire Ant : Automatiser l'exécution de transformations XSLT http://doc.crzt.fr STÉPHANE CROZAT 16 octobre 2014 Table des matières I - Introduction à Ant 5 A. Présentation d'Apache Ant..............................................................................5 B. Fonctionnement d'un script Ant.......................................................................6 C. Exemple de tâches Ant..................................................................................7 D. Paramétrer un script Ant................................................................................7 II - Ant et XSLT 9 A. La tâche "xslt'".............................................................................................9 B. Usages Ant/XSLT...........................................................................................9 III - Exercices 11 A. Travaux pratiques Ant..................................................................................11 1. "Hello World !" en Ant......................................................................................................11 2. Une chaîne éditoriale avec ANT.........................................................................................11 Solution des exercices 15 Contenus annexes 19 3 Introduction à Ant I- I Présentation d'Apache Ant 5 Fonctionnement d'un script Ant 6 Exemple de tâches Ant 7 Paramétrer un script Ant 7 A. Présentation d'Apache Ant Définition ANT est un langage XML permettant d'automatiser des tâches, telles que l'exécution de programmes XSLT, la copie de fichiers, l'archivage, ... C'est un langage comparable à make. ANT est distribué par Apache sous licence libre. http://ant.apache.org/1 Exemple 1 2 3 4 5 <project name="MyProject" default="main"> <target name="main"> <echo message="Hello World !"/> </target> </project> Syntaxe : Lancement d'un script ANT 1 ant -buildfile fichier.ant Fondamental http://ant.apache.org/manual/2 1 - http://ant.apache.org/ 2 - http://ant.apache.org/manual/ 5 Introduction à Ant Introduction à Ant B. Fonctionnement d'un script Ant Structure d'un script Ant Un script - ou projet - Ant correspond à un fichier XML dont l'élément racine est <project>. Un projet contient une ou plusieurs cibles <target>, dont l'une est la cible par défaut qui sera "visée" au lancement du projet (attribut default de <project>). Chaque cible contient un ensemble de tâches qui doit être exécuté lorsque la cible est visée. Le nom de l'élément identifie la tâche : <echo>, <xslt>, <copy>, <zip>... Principe du chaînage des cibles Une cible peut dépendre d'autres cibles (attribut depends de <target>). Lorsqu'une cible dépend d'autres cibles, le moteur Ant les exécute avant d'exécuter la cible initialement visée. Fonctionnement des targets Ant (barlatier.developpez.com/eclipse/tutorial/ant) 6 6 Introduction à Ant Exemple 1 2 3 4 5 6 7 8 <project name="MyProject" default="main" basedir="/home/stc/nf29"> <target name="main" depends="target1"> <echo message="Cible initialement visée"/> </target> <target name="target1"> <echo message="Cible préalablement exécutée"/> </target> </project> Dans cet exemple la tâche target1 sera exécutée avant la tâche main, qui est la tâche initialement appelée au lancement du programme. Remarque : basedir L'attribut basedir de <project> permet de définir le répertoire de travail par défaut du script. Complément : Explication générale du fonctionnement d'Ant http://barlatier.developpez.com/eclipse/tutorial/ant/#Lb3 C. Exemple de tâches Ant Exemple <ant> Exécution de sous-scripts Ant <delete> <mkdir> <copy> <move>... Gestion de fichiers <echo> <splash> Affichage d'information <zip> <unzip> Compression, décompression de fichiers <property> Définition de constante Remarque Il est possible d'étendre ANT avec ses propres tâches écrites en Java (qui héritent de la classe abstraite Task d'Ant). D. Paramétrer un script Ant Pour passer des paramètres à un script Ant : 1. Ajouter une property au début du script : <property name="module" value="default"/> 2. Fixer la valeur de cette property au moment de l'appel au script grâce à la syntaxe -Dproperty 3 - http://barlatier.developpez.com/eclipse/tutorial/ant/#Lb 7 Introduction à Ant Introduction à Ant Exemple 1 2 3 4 5 6 7 <?xml version="1.0" encoding="UTF-8"?> <!-- test.ant --> <project> <property name="p">Default</property> <echo message="${p}"/> </project> 1 2 3 4 $ ant -buildfile test.ant Buildfile: /home/stc/Desktop/test.ant [echo] Default 1 2 3 4 $ ant -buildfile test.ant -Dp Hello Buildfile: /home/stc/Desktop/test.ant [echo] Hello 8 8 II - Ant et XSLT II La tâche "xslt'" Usages Ant/XSLT 9 11 A. La tâche "xslt'" Syntaxe : Exécution d'une XSLT <xslt> Complément http://ant.apache.org/manual/Tasks/style.html4 B. Usages Ant/XSLT Méthode Ant est un complément simple à XSLT pour créer des chaînes de transformation complètes sans recourir ni à une IHM, ni à un langage de programmation. Méthode : Enchaînement de transformations Ant permet d'exécuter plusieurs transformations en série. 1 2 <xslt in="src/fic1.xml" out="tmp/fic1b.xml" style="xsl/transf1.xsl"/> <xslt in="tmp/fic1b.xml" out="out/result.fo" style="xsl/transf2.xsl"/> Exemple Traiter un fichier de scénarisation XML qui pointe des fichiers de contenu (par exemple une map qui référence des topics en DITA, un paper qui pointe des sections externalisées en Scenari/Optim) pour obtenir un fichier unique par internalisation des fichiers pointés (grâce à la fonction XPath document) ; puis appliquer une seconde transformation pour obtenir un fichier FO. L'on pourra aussi ajouter la tâche permettant d'exécuter le rendu en PDF avec FOP typiquement. 4 - http://ant.apache.org/manual/Tasks/style.html 9 Ant et XSLT Ant et XSLT Méthode : Transformations en lot Ant permet d'exécuter plusieurs transformations en lot, pour tous les fichiers d'un répertoire par exemple. 1 <xslt basedir="src" destdir="out" extension=".html" style="xsl/transf.xsl"/> Exemple Traiter un ensemble de sources XML pour produire un site Web, si chaque fichier XML donne un fichier HTML. Méthode : Obtenir plusieurs résultats pour une seule source Ant permet d'enchaîner plusieurs XSLT sur un même fichier XML afin d'obtenir plusieurs résultats, liés entre eux. 1 2 <xslt in="src/xml1.xml" out="out/xml11.html" style="xsl/xsl1.xsl"/> <xslt in="src/xml1.xml" out="out/xml12.html" style="xsl/xsl2.xsl"/> Exemple Pour produire une publication comprenant plusieurs fichiers résultant liés (une publication temporalisée HTML5+Timesheet ou une publication paginée XHTML+CSS3 par exemple), il est nécessaire d'appliquer plusieurs XSLT à un même fichier XML. Méthode : Exécuter plusieurs XSLT en fonction d'un fichier XML Ant permet d'appliquer une XSLT à un fichier XML source, afin d'obtenir un nouveau fichier Ant qui contient plusieurs ordres de transformation, typiquement pour chacun des fils pointés par le fichier XML source. 1 2 <xslt in="src/xml1.xml" out="ant/xml1.ant" style="xsl/xsl1.xsl"/> <ant antfile="ant/xml1.ant"/> Le fichier xml1.ant contenant lui même une série d'exécutions XSLT qui ont été générées par xsl1.xsl. 1 2 3 <xsl:template match="topicref[@type='task']"> <xslt in="src/{@href}" out="out/{@ref}.html" style="xsl/topic.xsl"/> </xsl:template> Exemple Traiter un fichier de scénarisation XML qui pointe des fichiers de contenu pour obtenir un site Web (une map DITA qui référence des topics, un paper Scenari/Optim qui pointe des sections externalisées) : en transformant le fichier de scénarisation en index.html en générant un script Ant qui va transformer chacun des fils du fichier de scénarisation en fichier HTML (pointé par le index.html) 10 10 III - Exercices III Travaux pratiques Ant 21 A. Travaux pratiques Ant 1. "Hello World !" en Ant Question 1 Installer et tester l'environnement Ant avec un script affichant "Hello Word !" dans la console. Question 2 Créer un fichier XML contenant une unique balise racine <helloWorld>. Créer une XSLT le transformant en un fichier HTML affichant "Hello World !". Automatiser la transformation avec Ant. 2. Une chaîne éditoriale avec ANT [3h] Soit le modèle UML représentant des modules d'UV (scénario) pouvant contenir des grains de contenu (unité de contenu). Modèle UML Module/Grain Les modules possèdent un code, titre et un responsable. Les grains contiennent des divisions qui contiennent un titre et du texte. Un texte est un ensemble de paragraphes, avec éventuellement des mots en exergue et des mots étrangers. 11 Exercices Exercices Question 1 [Solution n°1 p 15] Compléter le modèle UML. Écrire les schémas correspondant. Produire des fichiers XML exemples valides : au minimum deux modules et trois grains, avec un grain commun aux deux modules et un grain original par module. Organiser les fichiers comme suit : un dossier src/modules pour les modules, un dossier src/grains pour les grains Question 2 [Solution n°2 p 16] Créer les transformations XSLT permettant de générer un site HTML pour un module. Le site contiendra un fichier index.html avec un sommaire pointant un fichier HTML pour chaque grain. Pour les grains on affichera les divisions sous la forme de blocs escamotables (en cliquant sur le titre on affiche ou masque son contenu), et on posera une CSS basique. Indice : Utiliser la fonction document() dans XSLT pour récupérer le titre des grains. Principales instructions XSLT - p.19 Question 3 [Solution n°3 p 16] Créer un script Ant module1.ant permettant d'exécuter les transformations et copies de fichiers (JavaScript et CSS) nécessaires au premier module (énumérer toutes les copies et transformations une par une dans le fichier Ant). Le fichier Ant est à déposer dans un dossier ant, le site résultant dans result/site. Question 4 [Solution n°4 p 17] Créer le script Ant main.ant prenant en paramètre un module et assurant les tâches suivantes : 1. Créer un dossier result/site/$m (ou $m désigne le nom module) 2. Transforme le module en index.html dans son dossier 3. Transforme le module en script Ant permettant de lancer les transformation de tous les grains qu'il contient et exécutant ce script Le fichier Ant à exécuter aura été placé dans un dossier tmp qui aura été vidé au début du script. Penser également à purger le répertoire result. 4. Effectue les copies de fichiers nécessaires (JavaScript et CSS typiquement) Indice : Paramétrer un script Ant Usages Ant/XSLT Question 5 Créer les XSLT et compléter le script Ant avec une nouvelle target pour générer les PDF correspondant aux modules. L'accès aux PDF se fera à partir de l'index.html d'un module. Indices : On utilisera FO. 12 12 Exercices On procédera à une transformation intermédiaire XML vers XML permettant d'internaliser les grains dans leur module. Question 6 Ajouter l'accès à un fichier Smil permettant de visualiser chaque division de chaque grain une par une. Question 7 Créer un éditeur Scenari permettant de produire un module et ses grains. Créer la transformation XML vers XML permettant de retrouver le schéma d'origine à partir des fichiers créés par Scenari. Finir d'automatiser avec Ant la chaîne permettant de générer l'ensemble des supports à partir d'une saisie dans Scenari. 13 Solution des exercices > Solution n°1 (exercice p. 12) 1 2 3 4 5 6 7 8 <?xml version="1.0" encoding="UTF-8"?> <!--m1.xml--> <module> <titre>Module 1</titre> ... <grain>g1</grain> <grain>g2</grain> </module> 1 2 3 4 5 6 7 8 <?xml version="1.0" encoding="UTF-8"?> <!--m2.xml--> <module> <titre>Module 2</titre> ... <grain>g3</grain> <grain>g2</grain> </module> 1 2 3 4 5 6 <?xml version="1.0" encoding="UTF-8"?> <!--g1.xml--> <grain> <titre>Grain 1</titre> ... </grain> 1 2 3 4 5 6 <?xml version="1.0" encoding="UTF-8"?> <!--g2.xml--> <grain> <titre>Grain 2</titre> ... </grain> 1 2 3 4 5 6 <?xml version="1.0" encoding="UTF-8"?> <!--g3.xml--> <grain> <titre>Grain 3</titre> ... </grain> > Solution n°2 (exercice p. 12) 15 Solution des exercices 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Solution des exercices <?xml version="1.0" encoding="UTF-8"?> <!--module.xsl--> <!-- Feuille XSLT permettant de transformer un module en index.html pointant sur ses grains --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="module"></xsl:applytemplates> </body> </html> </xsl:template> <xsl:template match="module"> <h1><xsl:value-of select="titre"/></h1> <xsl:apply-templates select="grain"/> </xsl:template> <xsl:template match="grain"> <p><a href="{.}.html"><xsl:value-of select="document(concat('../grains/',.,'.xml'))/grain/titre"/></a></p > </xsl:template> </xsl:stylesheet> <?xml version="1.0" encoding="UTF-8"?> <!--grain.xsl--> <!-- Feuille XSLT permettant de transformer un grain en fichier HTML --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="grain"></xsl:applytemplates> </body> </html> </xsl:template> <xsl:template match="grain"> <h1><xsl:value-of select="titre"/></h1> ... </xsl:template> </xsl:stylesheet> > Solution n°3 (exercice p. 12) 1 2 <?xml version="1.0" encoding="UTF-8"?> <!--module1.ant--> 16 16 Solution des exercices 3 4 5 6 7 8 9 10 <!-- Script Ant ne sachant transformer que le module 1, en énumérant explicitement toutes les transformation si un grain est ajouté au module m1.xml, ce fichier Ant doit également être modifié --> <project basedir=".." name="module1"> <xslt in="${basedir}/modules/m1.xml" out="$ {basedir}/result/site/index.html" xslresource="$ {basedir}/xsl/module.xsl"/> <xslt in="${basedir}/grains/g1.xml" out="$ {basedir}/result/site/g1.html" xslresource="$ {basedir}/xsl/grain.xsl"/> <xslt in="${basedir}/grains/g1.xml" out="$ {basedir}/result/site/g2.html" xslresource="$ {basedir}/xsl/grain.xsl"/> </project> > Solution n°4 (exercice p. 12) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?xml version="1.0" encoding="UTF-8"?> <!--main.ant--> <project basedir=".." name="main" default="default"> <property name="module" value="default"/> <target name="default" depends="preparation"> <xslt in="${basedir}/modules/${module}.xml" out="$ {basedir}/result/site/index.html" xslresource="$ {basedir}/xsl/module.xsl"/> <xslt in="${basedir}/modules/${module}.xml" out="$ {basedir}/tmp/tmp.ant" xslresource="${basedir}/xsl/module_ant.xsl"/> <ant antfile="${basedir}/tmp/tmp.ant"/> </target> <target name="preparation"> <delete dir="${basedir}/tmp"></delete> <delete dir="${basedir}/result"></delete> <mkdir dir="${basedir}/tmp"/> <mkdir dir="${basedir}/result"/> <mkdir dir="${basedir}/result/site"/> </target> </project> <?xml version="1.0" encoding="UTF-8"?> <!--module_ant.xsl--> <!-- Feuille XSLT permettant de transformer un module en index.html pointant sur ses grains --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <xsl:template match="/"> <project basedir=".." name="grains"> <xsl:apply-templates select="module/grain"/> </project> </xsl:template> <xsl:template match="grain"> <xsl:param name="in">${basedir}/grains/<xsl:value-of select="."/>.xml</xsl:param> 17 Solution des exercices 18 19 20 21 22 23 Solution des exercices <xsl:param name="out">${basedir}/result/site/<xsl:value-of select="."/>.html</xsl:param> <xsl:param name="xslt">${basedir}/xsl/grain.xsl</xsl:param> <xslt in="{$in}" out="{$out}" xslresource="{$xslt}"/> </xsl:template> </xsl:stylesheet> 18 18 Contenus annexes - Principales instructions XSLT Fondamental : Les deux instructions de base <xsl:apply-templates select="XPATH"/> : Relance les règles du programme sur le sous-arbre pointé par le select (fondement de la récursivité) <xsl:value-of select="XPATH"/> : Génère le texte contenu dans le nœud ou attribut pointé par le select {XPATH} : Génère le texte contenu dans le nœud ou attribut pointé par le XPath entre accolades (alternative à xsl:value-of à utiliser dans la génération d'attributs exclusivement, par exemple : <img src="{@URIsrc}"> Autres instructions courantes <xsl:copy-of select="XPATH"/> : Génère le sous-arbre pointé par le select <xsl:if test="XPATH">...</xsl:if> : Ne s'exécute que si test est vrai <xsl:for-each select="XPATH">...</xsl:for-each> : chaque sous-arbre renvoyé par le select Complément Exécute pour : Extension XPath "document()" document(chemin-accès) où chemin d'accès permet d'accéder à un fichier sur le disque. Par exemple : document("c:\monfichier.xml")//x : Tous les éléments x présents dans le fichier monfichier.xml. document(child::source)/* : La racine du document XML pointé par l'expression XPath child::source. Complément : Déclaration explicite sur la cible <xsl:element name="">contenu</xsl:element> <xsl:attribute name="">valeur</xsl:attribute> <xsl:text>chaîne de caractère</xsl:text Complément : Référence http://fr.selfhtml.org/xml/representation/elementsxslt.htm5 5 - http://fr.selfhtml.org/xml/representation/elementsxslt.htm 19 Contenus annexes Complément Contenus annexes : Références synthétiques https://developer.mozilla.org/fr/XSLT/Éléments 6 http://www.daniel-lemire.com/inf6450/mod3/xsltenbref.xhtml 7 http://personnel.univ-reunion.fr/fred/Enseignement/XML/intro-xslt.html 8 6 - https://developer.mozilla.org/fr/XSLT/%C3%89l%C3%A9ments 7 - http://www.daniel-lemire.com/inf6450/mod3/xsltenbref.xhtml 8 - http://personnel.univ-reunion.fr/fred/Enseignement/XML/intro-xslt.html 20 20