Tuteur XSL-FO -- XSL-FO tutorial (gilles.hunault@univ-angers.fr)

Valid XHTML 1.0!                  

Repères pour les Balises de XSL-FO

XSL-FO utilise des "objets de formattage" (ou FO, formatting objects en anglais) comme les chapitres, pages, paragraphes, listes... et des propriétés pour ces objets comme les longeurs de marges, les spécifications de polices de caractères... Comme pour d'autres systèmes de mise en page, l'unité de base est une "boite" ou "zone" en principe rectangulaire, comprenant ou cheveauchant d'autres boites qui elles-mêmes comprennent ou chevauchent d'autres boites... Les balises, liées à l'espace de noms XSL/Format du W3 sont bien sûr préfixée par fo: comme la balise principale du document XML nommé fo:root. On notera qu'un fichier pour XSL-FO a en général comme extension .fo et non pas .xml.

Le vocabulaire de base utilisé par XSL-FO comprend quatre termes importants :

  • les définitions "maitre",
  • les suites (ou "séquences) de page,
  • les flux,
  • les blocs.

Les définitions maitre fo:layout-master-det correspondent au formatage global (on pourrait dire au modèle du document) comme les marges du document. Les suites de page fo:page-sequence regroupent comme leurs noms l'indiquent les parties de texte de grande taille (une page ou plus) comme les chapitres d'un livre. Les flux fo:flow sont des suites de boites comme les sections à l'intérieur d'une suite de pages. Enfin, les blocs fo:block correspondent à des sous-boites un peu comme des divisions d'une section et les paragraphes.

Une page de titre avec XSL-FO

Le fichier titre.fo est un exemple de page de titre. Une fois traité par exemple avec fop il produit le document PDF nommé titre.pdf. Une copie en mode texte du fichier de formatage nommée titrefo.txt permet de mieux voir le texte (cadré à gauche) à afficher et les instructions indentées pour XSL-FO que nous reproduisons ici colorisé :


     <?xml version="1.0" encoding="ISO-8859-1" ?>

     <!-- un exemple de page de titre -->

     <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

       <fo:layout-master-set>
         <fo:simple-page-master master-name="titreGH"
                       page-height="29.7cm"
                       page-width="21cm"
                       margin-top="2cm"
                       margin-bottom="1cm"
                       margin-left="2.5cm"
                       margin-right="2.5cm">
           <fo:region-body margin-top="1cm"/>
           <fo:region-before extent="3cm"/>
           <fo:region-after extent="1.5cm"/>
         </fo:simple-page-master>
       </fo:layout-master-set>

       <fo:page-sequence master-reference="titreGH">
         <fo:flow flow-name="xsl-region-body">

           <fo:block-container position="absolute"
                     border-color="#880000" border-style="solid" border-width=".3mm"
                     top="-0.5cm" left="9cm" height="2cm" width="7.5cm" >
           </fo:block-container>

           <fo:block font-size="30pt"
                        space-after.optimum="200pt"
                        text-align="end">

     Année 2005

           </fo:block>

           <fo:block font-size="48pt"
                 font-family="sans-serif"
                 line-height="48pt"
                 space-after.optimum="350pt"
                 background-color="white"
                 color="blue"
                 text-align="center"
                 padding-top="3pt">

     Dossier Relations CCI et autres OIO

           </fo:block>

           <fo:block-container height="3cm" width="10cm" top="22cm" left="2.5cm" position="absolute">
              <fo:block font-size="20pt" line-height="20pt" text-align="start" >
                Dossier suivi par :
              </fo:block>
           </fo:block-container>

           <fo:block-container height="3cm" width="10cm" top="22cm" left="4.5cm" position="absolute">
              <fo:block font-weight="bold" font-size="20pt" line-height="20pt" text-align="end">

     Gilles HUNAULT

              </fo:block>
           </fo:block-container>

           <fo:block font-size="26pt"
                     font-family="sans-serif"
                     line-height="26pt"
                     space-after.optimum="0pt"
                     text-align="center">

     Université d'Angers

           </fo:block>

         </fo:flow>
       </fo:page-sequence>

     </fo:root>

On s'entrainera à reconnaitre les balises, à noter comment on désigne les parties du corps (body) de texte, quelles balises supportent les polices de caractères et lesquelles gérent les espacements entre boites...

Si on désire produire de nombreuses pages de titre, il suffit d'écrire des fichiers XML ne contenant que ces informations et de les convertir avec un transformation XSL. Par exemple le fichier titre.xml couplé à la feuille de style titre.xsl produit exactement le fichier titre.fo cité.

Schématiquement, la feuille de style recopie les informations fixes et extrait les informations variables. On peut la voir comme un habillage de la feuille de style titremini.xsl.

Voici le contenu de ces fichiers :



Fichier titre.xml


     <?xml version="1.0" encoding="ISO-8859-1" ?>
     <pagetitre>
     <an>
     2005
     </an>
     <titre>
     Dossier Relations CCI et autres OIO
     </titre>
     <suiveur>
     Gilles HUNAULT
     </suiveur>
     </pagetitre>


Fichier titremini.xsl



     <?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="xml"  encoding="ISO-8859-1" />

     <xsl:template match="/">
     <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

          ...
          <xsl:value-of select="//an" />
          ...
          <xsl:value-of select="//titre" />
          ...
          <xsl:value-of select="//suiveur" />

     </fo:root>
     </xsl:template>

     </xsl:stylesheet>



Fichier titrem.xsl



     <?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="xml"  encoding="ISO-8859-1" />

     <xsl:template match="/">
     <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

       <fo:layout-master-set>
         <fo:simple-page-master master-name="titreGH"
                       page-height="29.7cm"
                       page-width="21cm"
                       margin-top="2cm"
                       margin-bottom="1cm"
                       margin-left="2.5cm"
                       margin-right="2.5cm">
           <fo:region-body margin-top="1cm"/>
           <fo:region-before extent="3cm"/>
           <fo:region-after extent="1.5cm"/>
         </fo:simple-page-master>
       </fo:layout-master-set>

       <fo:page-sequence master-reference="titreGH">
         <fo:flow flow-name="xsl-region-body">

           <fo:block-container position="absolute"
                     border-color="#880000" border-style="solid" border-width=".3mm"
                     top="-0.5cm" left="9cm" height="2cm" width="7.5cm" >
           </fo:block-container>

           <fo:block font-size="30pt"
                        space-after.optimum="200pt"
                        text-align="end">
     Année <xsl:value-of select="//an" />
           </fo:block>

           <fo:block font-size="48pt"
                 font-family="sans-serif"
                 line-height="48pt"
                 space-after.optimum="350pt"
                 background-color="white"
                 color="blue"
                 text-align="center"
                 padding-top="3pt">
     <xsl:value-of select="//titre" />
           </fo:block>

           <fo:block-container height="3cm" width="10cm" top="22cm" left="2.5cm" position="absolute">
              <fo:block font-size="20pt" line-height="20pt" text-align="start" >
                Dossier suivi par :
              </fo:block>
           </fo:block-container>

           <fo:block-container height="3cm" width="10cm" top="22cm" left="4.5cm" position="absolute">
              <fo:block font-weight="bold" font-size="20pt" line-height="20pt" text-align="end">
     <xsl:value-of select="//suiveur" />
              </fo:block>
           </fo:block-container>

           <fo:block font-size="26pt"
                     font-family="sans-serif"
                     line-height="26pt"
                     space-after.optimum="0pt"
                     text-align="center">
             Université d'Angers
           </fo:block>

         </fo:flow>
       </fo:page-sequence>

     </fo:root>
     </xsl:template>

     </xsl:stylesheet>

Une brochure avec les liste des services XSL-FO

Passons maintenant à un document un peu plus long : nous allons rajouter des listes de services, de personnes dans notre document. Voici le document listes.fo à formater et son résultat listes.pdf en PDF. Comme la source du document l'indique, le formatage n'est pas compliqué, il est simplement long, complexe et technique. Nous avons colorisé les parties nouvelles :


   <?xml version="1.0" encoding="ISO-8859-1" ?>

   <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

     <fo:layout-master-set>
       <fo:simple-page-master master-name="titreGH"
                     page-height="29.7cm"
                     page-width="21cm"
                     margin-top="2cm"
                     margin-bottom="1cm"
                     margin-left="2.5cm"
                     margin-right="2.5cm">
         <fo:region-body margin-top="1cm"/>
         <fo:region-before extent="3cm"/>
         <fo:region-after extent="1.5cm"/>
       </fo:simple-page-master>

       <fo:simple-page-master master-name="listeGH"
                     page-height="29.7cm"
                     page-width="21cm"
                     margin-top="2cm"
                     margin-bottom="2cm"
                     margin-left="3cm"
                     margin-right="3cm">
         <fo:region-body margin-top="2cm"/>
         <fo:region-before extent="3cm"/>
         <fo:region-after extent="2cm"/>
       </fo:simple-page-master>

     </fo:layout-master-set>

     <fo:page-sequence master-reference="titreGH">
       <fo:flow flow-name="xsl-region-body">

         <fo:block-container position="absolute"
                   border-color="#880000" border-style="solid" border-width=".3mm"
                   top="-0.5cm" left="9cm" height="2cm" width="7.5cm" >
         </fo:block-container>

         <fo:block font-size="30pt"
                      space-after.optimum="200pt"
                      text-align="end">
              Année 2005
         </fo:block>

         <fo:block font-size="48pt"
               font-family="sans-serif"
               line-height="48pt"
               space-after.optimum="350pt"
               background-color="white"
               color="blue"
               text-align="center"
               padding-top="3pt">
           Liste des services
         </fo:block>

         <fo:block font-size="26pt"
                   line-height="26pt"
                   space-after.optimum="10pt"
                   text-align="center">
           Responsable des impressions :
         </fo:block>

         <fo:block font-size="26pt"
                   line-height="26pt"
                   font-weight="bold"
                   space-after.optimum="0pt"
                   text-align="center">
           Gilles HUNAULT
         </fo:block>

       </fo:flow>
     </fo:page-sequence>

     <fo:page-sequence master-reference="listeGH">

       <fo:flow flow-name="xsl-region-body">

         <fo:block font-size="20pt" font-weight="bold" space-after.optimum="40pt">
         1. Composition des services
         </fo:block>

         <fo:block font-size="16pt" font-weight="bold" space-after.optimum="20pt">
         Service Achats
         </fo:block>

         <fo:list-block>

           <fo:list-item>
              <fo:list-item-label start-indent="2cm">
                <fo:block font-size="14pt" font-weight="bold">
                   •
                </fo:block>
              </fo:list-item-label>
              <fo:list-item-body start-indent="2.5cm">
                <fo:block font-size="14pt" space-after.optimum="14pt">
                Dupond
                </fo:block>
              </fo:list-item-body>
           </fo:list-item>

           <fo:list-item>
              <fo:list-item-label start-indent="2cm">
                <fo:block font-size="14pt" font-weight="bold">
                   •
                </fo:block>
              </fo:list-item-label>
              <fo:list-item-body start-indent="2.5cm">
                <fo:block font-size="14pt" space-after.optimum="14pt">
                Dupuis
                </fo:block>
              </fo:list-item-body>
           </fo:list-item>

           <fo:list-item>
              <fo:list-item-label start-indent="2cm">
                <fo:block font-size="14pt" font-weight="bold">
                   •
                </fo:block>
              </fo:list-item-label>
              <fo:list-item-body start-indent="2.5cm">
                <fo:block font-size="14pt" space-after.optimum="14pt">
                Durand
                </fo:block>
              </fo:list-item-body>
           </fo:list-item>

         </fo:list-block>

         <fo:block font-size="16pt" font-weight="bold" space-after.optimum="20pt">
         Service Courrier
         </fo:block>

         <fo:list-block>

           <fo:list-item>
              <fo:list-item-label start-indent="2cm">
                <fo:block font-size="14pt" font-weight="bold">
                   •
                </fo:block>
              </fo:list-item-label>
              <fo:list-item-body start-indent="2.5cm">
                <fo:block font-size="14pt" space-after.optimum="14pt">
                Ambrosin
                </fo:block>
              </fo:list-item-body>
           </fo:list-item>

           <fo:list-item>
              <fo:list-item-label start-indent="2cm">
                <fo:block font-size="14pt" font-weight="bold">
                   •
                </fo:block>
              </fo:list-item-label>
              <fo:list-item-body start-indent="2.5cm">
                <fo:block font-size="14pt" space-after.optimum="14pt">
                Tenardier
                </fo:block>
              </fo:list-item-body>
           </fo:list-item>

         </fo:list-block>

         <fo:block font-size="20pt" font-weight="bold" space-after.optimum="40pt">
         2. Liste alphabétique des personnes
      ...
         </fo:block>

       </fo:flow>
     </fo:page-sequence>

   </fo:root>

 


 

retour   Retour à la page principale de   (gH)