Ant - Cours (Stéphane Crozat)
Transcription
Ant - Cours (Stéphane Crozat)
Ant : Automatiser l'exécution de transformations XSLT Ingénierie Documentaire http://doc.crzt.fr Stéphane Crozat 14 septembre 2016 Table des matières I - Introduction à Ant 3 1. Présentation d'Apache Ant ........................................................................................................ 3 2. Fonctionnement d'un script Ant 3. Exemple de tâches Ant ............................................................................................................. 5 4. Paramétrer un script Ant ......................................................................................................... 5 5. Gestion d'exceptions en Ant ..................................................................................................... 6 II - Ant et XSLT 1. La tâche "xslt'" 2. Usages Ant/XSLT .............................................................................................. 3 7 ......................................................................................................................... 7 ...................................................................................................................... 7 3. Passer des paramètres aux XSLT III - Exercices 1. Travaux pratiques Ant ............................................................................................ 8 10 ............................................................................................................ 11 1.1. Exercice : "Hello World !" en Ant ................................................................................................................ 11 1.2. Exercice : Une chaîne éditoriale avec ANT ................................................................................................. 11 Solutions des exercices 14 Introduction à Ant Introduction à Ant I 1. 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/ Exemple 1 <project name="MyProject" default="main"> 2 <target name="main"> 3 <echo message="Hello World !"/> 4 </target> 5 </project> Syntaxe : Lancement d'un script ANT 1 ant -buildfile fichier.ant Fondamental http://ant.apache.org/manual/ 2. 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>... 3 Fonctionnement d'un script Ant 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) Exemple 1 <project name="MyProject" default="main" basedir="/home/stc/nf29"> 2 <target name="main" depends="target1"> 3 <echo message="Cible initialement visée"/> 4 </target> 5 <target name="target1"> 6 <echo message="Cible préalablement exécutée"/> 7 </target> 8 </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. 4 Exemple de tâches Ant 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/#Lb 3. 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). 4. 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 Exemple 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- test.ant --> 3 <project> 4 <property name="p">Default</property> 5 <echo message="${p}"/> 6 </project> 7 1 $ ant -buildfile test.ant 2 Buildfile: /home/stc/Desktop/test.ant 5 Gestion d'exceptions en Ant 3 4 [echo] Default 1 $ ant -buildfile test.ant -Dp Hello 2 Buildfile: /home/stc/Desktop/test.ant 3 [echo] Hello 4 5. Gestion d'exceptions en Ant Gestion d'exceptions en Ant http://ant-contrib.sourceforge.net/tasks/tasks/trycatch.html 6 Ant et XSLT Ant et XSLT II 1. La tâche "xslt'" Syntaxe : Exécution d'une XSLT <xslt> Complément http://ant.apache.org/manual/Tasks/style.html 2. 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 <xslt in="src/fic1.xml" out="tmp/fic1b.xml" style="xsl/transf1.xsl"/> 2 <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. 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"/> 7 Passer des paramètres aux XSLT 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 <xslt in="src/xml1.xml" out="out/xml11.html" style="xsl/xsl1.xsl"/> 2 <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 <xslt in="src/xml1.xml" out="ant/xml1.ant" style="xsl/xsl1.xsl"/> 2 <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 <xsl:template match="topicref[@type='task']"> 2 <xslt in="src/{@href}" out="out/{@ref}.html" style="xsl/topic.xsl"/> 3 </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) 3. Passer des paramètres aux XSLT Il est possible de passer des variables à un programme XSLT depuis un script ANT. 8 Passer des paramètres aux XSLT Exemple : Côté ANT 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns:bib="http://bibtexml.sf.net/" xmlns:op="utc.fr:ics/opale3" basedir="." name="ref"> 3 <xslt in="../out.xml" xslresource="../XSL/OneBibXMLToOpaleXml.xsl" out="../out1.xml"> 4 <param name="Position" expression="1"/> 5 </xslt> 6 <xslt in="../out.xml" xslresource="../XSL/OneBibXMLToOpaleXml.xsl" out="../out5.xml"> 7 <param name="Position" expression="5"/> 8 </xslt> 9 </project> Exemple : Côté XSLT 1 <?xml version="1.0" encoding="UTF-8"?> 2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 3 xmlns:bib="http://bibtexml.sf.net/" 4 xmlns:op="utc.fr:ics/opale3"> 5 6 <xsl:output encoding="UTF-8" method="xml" indent="yes"/> 7 <xsl:param name="Position"/> 8 <xsl:template match="bib:file"> 9 <xsl:for-each select="bib:entry"> 10 <xsl:if test="position()=$Position"> 11 <sc:item xmlns:sc="http://www.utc.fr/ics/scenari/v3/core"> 12 <op:bib xmlns:sp="http://www.utc.fr/ics/scenari/v3/primitive" xmlns:op="utc.fr:ics/opale3"> 13 <op:bibM> 14 </op:bibM> 15 </op:bib> 16 </sc:item> 17 </xsl:if> 18 </xsl:for-each> 19 </xsl:template> 20 21 </xsl:stylesheet> 1. On passe donc un paramètre à l'aide de : <param name="Position" expression="5" /> 2. On le récupère dans le XSLT à l'aide de : <xsl:param name="Position"/> 3. C'est utilisé dans l'exemple pour faire un test de position avec <xsl:if test=" position()=$Position"> 9 Exercices Exercices III 10 Exercice : "Hello World !" en Ant 1. Travaux pratiques Ant 1.1. Exercice : "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. 1.2. Exercice : 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. Question 1 [solution n°1 p.14] [ *] 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 11 Exercice : Une chaîne éditoriale avec ANT Question 2 [solution n°2 p.14] [ *] 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 (cf. p.) Question 3 [solution n°3 p.15] [ *] 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.16] [ *] 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 (cf. p.5) Usages Ant/XSLT (cf. p.7) 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. On procédera à une transformation intermédiaire XML vers XML permettant d'internaliser les grains dans leur module. 12 Exercice : Une chaîne éditoriale avec ANT 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 Solutions des exercices Solutions des exercices > Solution n°1 Exercice p. 11 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--m1.xml--> 3 <module> 4 <titre>Module 1</titre> 5 ... 6 <grain>g1</grain> 7 <grain>g2</grain> 8 </module> 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--m2.xml--> 3 <module> 4 <titre>Module 2</titre> 5 ... 6 <grain>g3</grain> 7 <grain>g2</grain> 8 </module> 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--g1.xml--> 3 <grain> 4 <titre>Grain 1</titre> 5 ... 6 </grain> 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--g2.xml--> 3 <grain> 4 <titre>Grain 2</titre> 5 ... 6 </grain> 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--g3.xml--> 3 <grain> 4 <titre>Grain 3</titre> 5 ... 6 </grain> 14 Stéphane Crozat (Contributions : les étudiants de NF29) Solutions des exercices Exercice p. 12 > Solution n°2 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--module.xsl--> 3 <!-- Feuille XSLT permettant de transformer un module en index.html pointant sur ses grains --> 4 5 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 6 version="1.0"> 7 8 <xsl:output method="xml"/> 9 10 <xsl:template match="/"> 11 <html> 12 <body> 13 <xsl:apply-templates select="module"></xsl:apply-templates> 14 </body> 15 </html> 16 </xsl:template> 17 18 <xsl:template match="module"> 19 <h1><xsl:value-of select="titre"/></h1> 20 <xsl:apply-templates select="grain"/> 21 </xsl:template> 22 23 <xsl:template match="grain"> 24 <p><a href="{.}.html"><xsl:value-of select="document(concat('../grains/',.,'.xml'))/grain/titre" /></a></p> 25 </xsl:template> 26 27 </xsl:stylesheet> 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--grain.xsl--> 3 <!-- Feuille XSLT permettant de transformer un grain en fichier HTML --> 4 5 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 6 version="1.0"> 7 8 <xsl:output method="xml"/> 9 10 <xsl:template match="/"> 11 <html> 12 <body> 13 <xsl:apply-templates select="grain"></xsl:apply-templates> 14 </body> 15 </html> 16 </xsl:template> 17 18 <xsl:template match="grain"> 19 <h1><xsl:value-of select="titre"/></h1> 20 ... 21 </xsl:template> 22 23 </xsl:stylesheet> 15 Stéphane Crozat (Contributions : les étudiants de NF29) Solutions des exercices > Solution n°3 Exercice p. 12 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--module1.ant--> 3 <!-- Script Ant ne sachant transformer que le module 1, en énumérant explicitement toutes les transformation 4 si un grain est ajouté au module m1.xml, ce fichier Ant doit également être modifié --> 5 6 <project basedir=".." name="module1"> 7 <xslt in="${basedir}/modules/m1.xml" out="${basedir}/result/site/index.html" xslresource="${basedir} /xsl/module.xsl"/> 8 <xslt in="${basedir}/grains/g1.xml" out="${basedir}/result/site/g1.html" xslresource="${basedir} /xsl/grain.xsl"/> 9 <xslt in="${basedir}/grains/g1.xml" out="${basedir}/result/site/g2.html" xslresource="${basedir} /xsl/grain.xsl"/> 10 </project> > Solution n°4 Exercice p. 12 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--main.ant--> 3 4 <project basedir=".." name="main" default="default"> 5 6 <property name="module" value="default"/> 7 8 <target name="default" depends="preparation"> 9 <xslt in="${basedir}/modules/${module}.xml" out="${basedir}/result/site/index.html" xslresource= "${basedir}/xsl/module.xsl"/> 10 <xslt in="${basedir}/modules/${module}.xml" out="${basedir}/tmp/tmp.ant" xslresource="${basedir} /xsl/module_ant.xsl"/> 11 <ant antfile="${basedir}/tmp/tmp.ant"/> 12 </target> 13 14 <target name="preparation"> 15 <delete dir="${basedir}/tmp"></delete> 16 <delete dir="${basedir}/result"></delete> 17 <mkdir dir="${basedir}/tmp"/> 18 <mkdir dir="${basedir}/result"/> 19 <mkdir dir="${basedir}/result/site"/> 20 </target> 21 22 </project> 23 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--module_ant.xsl--> 3 <!-- Feuille XSLT permettant de transformer un module en index.html pointant sur ses grains --> 4 5 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 6 version="1.0"> 7 8 <xsl:output method="xml"/> 9 16 Stéphane Crozat (Contributions : les étudiants de NF29) Solutions des exercices 10 <xsl:template match="/"> 11 <project basedir=".." name="grains"> 12 <xsl:apply-templates select="module/grain"/> 13 </project> 14 </xsl:template> 15 16 <xsl:template match="grain"> 17 <xsl:param name="in">${basedir}/grains/<xsl:value-of select="."/>.xml</xsl:param> 18 <xsl:param name="out">${basedir}/result/site/<xsl:value-of select="."/>.html</xsl:param> 19 <xsl:param name="xslt">${basedir}/xsl/grain.xsl</xsl:param> 20 <xslt in="{$in}" out="{$out}" xslresource="{$xslt}"/> 21 </xsl:template> 22 23 </xsl:stylesheet> Exemple : Un exemple partiel de solution ant.zip (cf. ant.zip) 17 Stéphane Crozat (Contributions : les étudiants de NF29)