Skip to content

Faire un peu plus que des fichiers texte avec du XSL – N°6/XXX

01/02/2010

Bon, c’est pas tout ça, mais jusque-là nous n’avons produit que des fichiers texte, sans mise en forme ni structuration.

XSL permet de traiter des fichiers XML, pour en produire d’autres fichiers de toutes sortes, notamment :

  • XML
  • HTML
  • et tous les fichier textes sans balises, tels CSV, SQL, etc.

Donc un fichier XSL peut contenir deux sortes de balises :

  • les balises XSL, préfixées <xsl:. Elles traitent, récupèrent, manipulent les valeurs trouvées dans les fichiers XML (et éventuellement génèrent de nouvelles valeurs)
  • toutes les autres balises non préfixées par <xsl:. Toutes ces balises-là seront donc présentes dans le fichier produit en sortie.

Déjà vu : produire du texte brut

Revenons au billet précédent qui proposait un fichier XSL permettant d’extraire la liste des communes ayant 0 inscrit en 2005.

Voici le contenu du fichier XSL :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
  <xsl:for-each select="//an2005/inscrits[.='0']">
    <xsl:value-of select="ancestor::ville/@nom"/>
    <xsl:text>
</xsl:text>
  </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Il génère un simple fichier texte (une liste de ville), chaque nom de ville étant à la ligne :

Marboz
Saint-Georges-de-Didonne
La Roche-Chalais
Novéant-sur-Moselle
Chevrières
Rhinau
Blacé
Provins
Roissy-en-Brie
Beauvoir-sur-Niort
Bonifacio

Intégrer des balises HTML dans la feuille XSL, pour obtenir un fichier HTML en sortie

Si je veux que cette liste soit en réalité un fichier HTML contenant ces noms, avec la même mise en forme (saut à la ligne), le code de ce fichier HTML sera :

<html>
<head>
<title>Liste des villes ayant 0 inscrit en 2005</title>
</head>
<body>
<p>
Marboz<br/>
Saint-Georges-de-Didonne<br/>
La Roche-Chalais<br/>
Novéant-sur-Moselle<br/>
Chevrières<br/>
Rhinau<br/>
Blacé<br/>
Provins<br/>
Roissy-en-Brie<br/>
Beauvoir-sur-Niort<br/>
Bonifacio</p>
</body>
</html>

Mon fichier XSL doit donc contenir les balises HTML, en distinguant :

  • les balises qui seront générées quel que soit le nombre de villes concernées : ce sont les balises <html>, <head>, <title>, <body>, <p> (balises en gras)
  • les balises qui seront générées pour chaque ville : ce sont les balises <br/>. En effet pour chaque ville, je dois récupérer le nom de la ville et mettre une balise <br/> (balise de saut de ligne)

Et voilà ce que ça donne
(si vous lisez ce billet directement sur le blog, ouvrez le fichier XSL en cliquant sur le texte : sans cela, la largeur de colonne du blog tronque les fins de lignes…)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
        <html>
          <head><title>Liste des villes ayant 0 inscrit en 2005</title></head>
         <body>
            <p>
              <xsl:for-each select="//an2005/inscrits[.='0']">
                <xsl:value-of select="ancestor::ville/@nom"/>
                <br/>
                </xsl:for-each>
            </p>
         </body>
      </html>
  </xsl:template>
</xsl:stylesheet>

Explications :

  • A l’intérieur de la balise <xsl:template>, les balises globales sont posées (celles qui encadreront la liste des villes : <html>, <head>, <title>, <body>, <p>).
  • Et à l’intérieur de la boucle <xsl:for-each>, on rajoute une balise <br/>.

Exercice 1

Je ne vais pas faire de cours de HTML et vous apprendre les balises. Je ne prendrai pour ces exercices que des balises de bases, servant à générer des listes, des tableaux, des liens, etc. Je vous les suppose connues.

Reprenez le fichier XSL ci-dessus, et modifiez-le de manière à générer une liste à puces pour cette liste de villes (balise <ul> contenant des balises <li>).

Exercice 2

En tête de la liste produite dans l’exercice 1, rajoutez un paragraphe qui indiquera le nombre de villes ayant eu 0 inscrit en 2005 (fonction count(), déjà vue).

Advertisements
7 commentaires
  1. 15/02/2010 21:28

    Bonjour, suite à votre cours,
    en triant les données cela fait plus joli.

    Cordialement.
    Jean-Luc

  2. 15/02/2010 21:29

    Oups ! des données ont disparues.

    <xsl:sort select="ancestor::ville/@nom"/>

Trackbacks

  1. Série XSL : petit résumé au bout de deux mois « Bibliothèques [reloaded]
  2. Techno-fil (14/02/10) « pintiniblog
  3. Série XSL : Corrections pour le billet 6 « Bibliothèques [reloaded]
  4. Opérations mathématiques simples avec XSL — N°7/XXX « Bibliothèques [reloaded]
  5. Trier une liste en XSL – N°8/XXX « Bibliothèques [reloaded]

Les commentaires sont fermés.

%d blogueurs aiment cette page :