Bonjour,
Le mardi 29 novembre 2005 à 10:35 +0100, Stephane Bortzmeyer a écrit :
> [J'avais envoyé originellement ce message depuis une adresse
> non-abonnée et le crétin de logiciel qui a refusé ne m'a pas renvoyé
> le message, donc je dois tout retaper :-( ]
Le crétin de logiciel dans lequel vous tapez vos mails ne vous permet
pas de renvoyer un message?
> J'ai un schéma à moi qui contient des éléments imbriqués comme <para>
> et <code> :
>
> <para>Ce code :
> <code>
> printf("Hello\n");
> </code>
> fait ca tres bien.
> </para>
>
> Je cherche à le traduire en XHTML. Traduire bêtement <para> par <p> et
> <code> par <pre> ne marche pas car XHTML ne permet pas d'emboiter un
> <pre> dans un <p> (sans doute parce qu'il s'agit d'éléments bloc et
> qu'on ne peut apparemment pas mettre un élément bloc dans un autre
> élément bloc).
Cela dépend des éléments bloc puisque vous pouvez imbriquer les <div>.
C'est d'ailleurs une première solution : vous pouvez transformer <para>
en <div class="para"> et <bloc> en <div class="bloc"> et définir les
styles para et bloc pour obtenir la présentation souhaitée.
> Ma deuxième tentative était donc du genre :
>
> <xsl:template match="code">
> <xsl:if test="parent::p">
> </p>
> </xsl:if>
> <pre><xsl:value-of select="."/></pre>
> <xsl:if test="parent::p">
> <p>
> </xsl:if>
> </xsl:template>
>
> mais cela ne fonctionne évidemment pas, le document XSL n'est pas bien
> formé.
>
> Je note que les feuilles de style XSL de Docbook y arrivent puisqu'un
> <programlisting> inclus dans un <para> est bien traduit en
> XHTML. Mais, même en examinant verbatim.xsl et block.xsl, je ne
> comprends pas comment elles font.
Norm Walsh est un virtuose de XSLT mais ses feuilles de styles ne sont
pas toujours très faciles à lire...
Si on s'intéresse qu'à votre exemple, on peut écrire :
<xsl:template match="para">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="para/text()">
<p>
<xsl:value-of select="."/>
</p>
</xsl:template>
<xsl:template match="para/code">
<pre>
<xsl:apply-templates/>
</pre>
</xsl:template>
Cependant, cette transformation serait mise à mal par le moindre
commentaire, processing instruction ou sous élément qui viendrait
"segmenter" les champs texte.
Vous devez pouvoir vous en sortir en suivant un principe du type :
<xsl:template match="para" name="para.code">
<xsl:param name="index" select="0"/>
<xsl:variable name="nbCode" select="count(code)"/>
<p>
<xsl:apply-templates select="node()[count(preceding-sibling::code) = $index and
not(self::code)]"/>
</p>
<xsl:apply-templates select="code[$index + 1]"/>
<xsl:if test="$index < $nbCode">
<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>
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 Tue Nov 29 11:20:08 2005