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)