Skip to content

Les fichiers XML sont des arbres généalogiques — N° 4b/XXX

07/01/2010

Si un fichier XML est un arbre qui n’a ni fleur ni fruit, mais est plein de noeuds, c’est donc par définition un arbre généalogique : les familles sont souvent de vrais noeuds de vipères 😉

Nous restons sur ce fichier (voir billet précédent) qui fournit la population et le nombre d’inscrits pour chaque commune en 2005 et 2008.

Pour mémoire, voici les premières lignes

et voici la représentation arborescente

Chaque nœud a un nom, un type et une valeur. Par exemple :

  • le noeud <dll> (type element) a n  nœuds enfants, qui sont des nœuds de type element et de nom « ville »
  • chaque noeud attribute de nom « nom » a un noeud de type text : c’est le contenu des guillemets
  • Les noeuds « population » et « inscrits »
    • ont des noeuds enfants de type text
    • ont des noeuds parents de type element et de nom « an2005 » ou « an2008 »

Chaque étape dans l’arborescence sera séparée par un slash « / ».

  • Lorsque j’écris <xsl:for-each select= »dll/ville »>, je me place au niveau de chaque balise (ou « élément ») <ville> qui dépendrait d’une balise <dll>
  • Lorsque j’écris <xsl:for-each select= »//an2008/population »>, je considère toutes les balises <population> dépendant d’une balise <an2008> (laquelle balise <an2008> peut être n’importe où dans l’arborescence, à cause des //)
  • Si je me place à un endroit du fichier et que je veux connaître la valeur du noeud en cours, j’écrirai :
    • <xsl:value-of select= »self-node() »/> (valeur du noeud lui-même)
    • ou, en raccourci : <xsl:value-of select= ». »/>

    Par exemple : <xsl:for-each select= »//an2008/inscrits »><xsl:value-of select= ». »/></xsl:for-each> me donnera, pour toutes les années 2008, le nombre contenu dans la balise <inscrits>.

Chaque nouvelle fonction du fichier XSL se définit par rapport à la fonction précédente.

Par exemple si j’écris :

<xsl:template match= »/ »>
<xsl:for-each select= »ville »>
<xsl:value-of select= »self-node() »/>
</xsl:for-each>
</xsl:template>

  • A la première ligne, le processeur se positionne à la racine du document.
  • Ligne 2 : il cherche toutes les balise (un noeud enfant de type element) <ville> dépendant directement de la racine
  • Ligne 3 : il affiche la valeur de ces balises

Comme de la racine ne dépend aucune balise <ville> (mais seulement une balise <dll>), j’obtiendrai un fichier vide.

Lorsqu’on essaie de récupérer la valeur d’une balise (avec la fonction <xsl:value-of select= » »/>), ne pas tenir compte de la fonction précédente pour savoir « où » se trouve le processeur est sans doute la première cause d’erreur.

Petits exercices

Je doute que l’exercice ci-dessous vous semble très complexe, mais il ne s’agit pas de vous induire en erreur, ni même de vous faire utiliser du XSL, en fait — juste de vous forcer à prendre l’habitude de vous représenter un fichier XLM comme un arbre.

Exercice 1

Voici un fichier XML du même genre que les précédents : ce sont des notices administratives.
Cette fois je ne vous en explique pas la structure, vous devriez la trouver limpide.

Quelle est la description arborescente correspondante ?

  1. Proposition 1
  2. Proposition 2
  3. Proposition 3

Exercice 2

Voici un très court fichier XHTML. Le XHTML, ce sont des fichier qui respectent les règles du XML, mais en utilisant les balises HTML. Ils sont donc affichables par les navigateurs, et sont exploitables par les feuilles XSL.

Celui-ci crée une page web affichant simplement le texte :

Encore un exercice idiot sur XSL par Lully.

La difficulté supplémentaire consiste dans le fait que la balise <p> comporte à la fois du texte et des balises.

  1. Proposition 1
  2. Proposition 2
  3. Proposition 3
Publicités
%d blogueurs aiment cette page :