XSLT pour mettre en relation deux documents

Anne xslt xml csv

Le but est ici de produire un document CSV contenant certaines informations d’un document elements.xml et d’autres informations correspondantes provenant d’un autre document informations.xml.

Il s’agit d'écrire le transformateur elem2csv.xsl qui travaille sur elements.xml, le fichier informations.xml étant consulté en interne comme on va le voir. La commande pour faire la transformation va donc être :

$ xmlstarlet transform elem2csv.xsl elements.xml > elements.csv

Le fichier .xsl se présente de la façon suivante :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text" encoding="UTF-8" indent="yes" />

  <!-- Traitement de la racine -->
  ...
  <!-- Traitement des éléments -->
  ...
</xsl:stylesheet>

Dans le traitement de la racine, on affiche la ligne de titre du .csv et on appelle le traitement des éléments :

  <xsl:template match="/">
    <xsl:text>ID ; Name ; Status
</xsl:text>
    <xsl:apply-templates select="//Element" />
  </xsl:template>

Puis, pour chaque élément, on affiche ID et Name, et on recherche ID dans le fichier d’information.

<xsl:template match="Element">
    <xsl:variable name="id" select="@ID" />
    <xsl:value-of select="@ID"/> ; <xsl:value-of select="@Name"/>
    <xsl:text>;</xsl:text>
    <xsl:variable name="status"
      select="document('informations.xml')//Info[@REF = $id]/@Status"/>
    <xsl:choose>
      <xsl:when test="$status">
        <xsl:value-of select="$status" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="'Inconnu'" />
      </xsl:otherwise>
    </xsl:choose>
    <xsl:text>
</xsl:text>
</xsl:template>

On voit qu’on définit une variable status qui prend la valeur de l’attribut Status du noeud Info ayant pour attribut REF l’identifiant ID de l'élément traité dans le fichier informations.xml.

Enfin, on affiche la valeur trouvée s’il y en a une, et Inconnu sinon.

Voir aussi :