Le mardi 29 novembre 2005 à 21:56 +0100, Stephane Bortzmeyer a écrit :
> On Tue, Nov 29, 2005 at 11:20:07AM +0100,
> Eric van der Vlist <vdv@dyomedea.com> wrote
> a message of 123 lines which said:
> > Vous devez pouvoir vous en sortir en suivant un principe du type :
>
> Ah oui, très bien, ça marche, bravo et merci beaucoup.
>
> Deux petites remarques :
>
> 1) J'ai d'autres éléments que <code> et je dois donc compliquer le
> code (en attaché). Je n'ai pas l'impression que les variables de XSLT
> permettent de factoriser cette liste ?
>
> 2) Si un <code> est le dernier noeud d'un <para>, un élément <p/> vide
> est quand même produit. Pas très gênant mais je n'ai pas trouvé le
> moyen de le supprimer.
Voici une transformation qui gère <code> et <enum> et supprime cet
élément <p/> vide :
<?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:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="para" name="para.code">
<xsl:param name="index" select="0"/>
<xsl:variable name="elementsBloc" select="code|enum"/>
<xsl:variable name="debut"
select="node()[count(preceding-sibling::code|preceding-sibling::enum) = $index
and not(self::code|self::enum)]"/>
<xsl:if test="normalize-space($debut)">
<p>
<xsl:apply-templates select="$debut"/>
</p>
</xsl:if>
<xsl:apply-templates select="$elementsBloc[$index + 1]"/>
<xsl:if test="$index < count($elementsBloc)">
<xsl:call-template name="para.code">
<xsl:with-param name="index" select="$index + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="code">
<pre>
<xsl:apply-templates/>
</pre>
</xsl:template>
<xsl:template match="enum">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
</xsl:stylesheet>
Pour rajouter de nouveaux éléments "bloc", il faut modifier cette
transformation à trois endroits :
<xsl:variable name="elementsBloc" select="code|enum"/>
et
<xsl:variable name="debut"
select="node()[count(preceding-sibling::code|preceding-sibling::enum) = $index
and not(self::code|self::enum)]"/>
(deux fois)
puis rajouter des templates pour les nouveaux éléments.
On peut "factoriser" d'avantage comme vous dites et écrire:
<xsl:template match="para" name="para.code">
<xsl:param name="index" select="0"/>
<xsl:variable name="elementsBloc" select="code|enum"/>
<xsl:variable name="nbElementsBloc" select="count($elementsBloc)"/>
<xsl:variable name="debut" select="node()[count(preceding-sibling::*[count(.|$elementsBloc)
= $nbElementsBloc]) = $index and count(.|$elementsBloc) != $nbElementsBloc]"/>
<xsl:if test="normalize-space($debut)">
<p>
<xsl:apply-templates select="$debut"/>
</p>
</xsl:if>
<xsl:apply-templates select="$elementsBloc[$index + 1]"/>
<xsl:if test="$index < $nbElementsBloc">
<xsl:call-template name="para.code">
<xsl:with-param name="index" select="$index + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
L'ajout de nouveaux éléments bloc est facilité (il n'y a plus qu'un seul
endroit à modifier) mais la lecture de l'expression XPath n'en est pas
simplifiée...
Cordialement,
Eric van der Vlist
--
If you have a XML document, you have its schema.
http://examplotron.org
------------------------------------------------------------------------
Eric van der Vlist http://xmlfr.org http://dyomedea.com
(ISO) RELAX NG ISBN:0-596-00421-4 http://oreilly.com/catalog/relax
(W3C) XML Schema ISBN:0-596-00252-1 http://oreilly.com/catalog/xmlschema
------------------------------------------------------------------------
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Received on Wed Nov 30 09:34:34 2005