Hey Smiley smile ,

J'ai un soucis avec XSLT. Je travaille avec la version 1.0 (c'est pour ça que c'est ch***).

Voici un code (Docbook pour ceux qui ne reconnaîtrait pas) :
<para>Et voici une belle <emphasis>emphase</emphasis>, incroyable non ?</para>
J'aimerais le transformer en :
<p>Et voici une belle <em>emphase</em>, incroyable non ?</p>
Et bah j'arrive pas :cry:.

La version la plus aboutie que j'ai réussi à produire est :
<xsl:template name="p" match="para">
  <p>
    <xsl:foreach-each select=".">
       <xsl:choose>
         <xsl:when test="text()">
           <xsl:value-of select="." />
         </xsl:when>
         <xsl:otherwise>
           <xsl:apply-templates select="./*" />
         </xsl:otherwise>
       </xsl:choose>
     </xsl:for-each>
   </p>
 </xsl:template>
</xsl:template>
avec bien sûr :
<xsl:template name="em" match="emphasis>
  <em>
    <xsl:value-of select="." />
  </em>
</xsl:template>
Ce qui me produit :
<p>Et voici une belle emphase, incroyable non ?</p>
J'ai beau tourné le problème dans tous les sens, je n'arrive pas à trouver la bonne condition …

Le principe (si j'ai compris, ce qui n'est pas assuré) est qu'on utilise une boucle pour passer sur chaque élément de la balise. On teste si on a un texte ou si on a un nœud. Dans le premier cas, on affiche simplement le texte, dans l'autre, on applique les gabarits (templates) adéquates.

En XSLT 2.0 c'est plus clair, mais j'ai comme contrainte XSLT 1.0.

Merci pour vos lumières.
Modifié par HyWaN (04 Jan 2009 - 23:43)
Bonsoir!

Les templates permettent souvent de se simplifier la vie. Tu peux ainsi essayer tout simplement:

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>
    
<xsl:template match="para">
    <p><xsl:apply-templates/></p>
</xsl:template>
    
<xsl:template match="emphasis">
    <em><xsl:apply-templates/></em>
</xsl:template>


On utilise en fait le template par défaut des noeuds de type texte, qui consiste en leur recopie pure et simple...
Modifié par Gilles (04 Jan 2009 - 23:30)
Oui, une solution analogue a été trouvé sur PHPFrance par Victor Brito.

Je pensais à une solution séquentielle alors qu'il faut tout simplement laisser se propager les applications de gabarits à travers l'arbre.

Merci, sujet résolu Smiley smile .