Nœuds texte et balises

ViPHP
ViPHP | 4674 Messages

04 janv. 2009, 21:25

Hey :),

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) :

Code : Tout sélectionner

<para>Et voici une belle <emphasis>emphase</emphasis>, incroyable non ?</para>
J'aimerais le transformer en :

Code : Tout sélectionner

<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 :

Code : Tout sélectionner

<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 :

Code : Tout sélectionner

<xsl:template name="em" match="emphasis> <em> <xsl:value-of select="." /> </em> </xsl:template>
Ce qui me produit :

Code : Tout sélectionner

<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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 2937 Messages

04 janv. 2009, 22:23

As-tu essayé plus simplement ceci ?

Code : Tout sélectionner

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

ViPHP
ViPHP | 4674 Messages

04 janv. 2009, 22:36



Bon, ok, je vais aller dormir alors.
J'ai ajouté :

Code : Tout sélectionner

<xsl:template match="text()"> <xsl:value-of select="." /> </xsl:template>
pour des cas bizarres (on ne sait jamais …).

Merci Victor. Je voulais te demander par messagerie instantanée, mais t'étais pas connecté :P.

Ah mais si mon <emphasis> a encore des nœuds dedans ? Ça ne devrait pas marcher là. Il faut juste mettre

Code : Tout sélectionner

<xsl:apply-templates />
pour emphasis et effectivement avoir

Code : Tout sélectionner

<xsl:template match="text()">
pour arriver en bas de l'arbre.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).