Variations sur l'affichage des poèmes :
engendrer du texte / utiliser des entités

Cours M2-IM/XML du 27/10/2011

  1. Première solution
  2. Utiliser 

  3. Définir une entité "intelligible"
  4. Allons plus loin ! Ne nous laissons pas arrêter par des tigres de papier...

On part de la transformation Neruda2HTML.xsl discutée en détail précédemment.
On veut la modifier de manière à engendrer non plus du (X)HTML, mais du texte.
avec des exécutions de ce genre :

jfp% xsltproc Variations/Neruda2txt.xsl Corpus/P15.xml

Visualisation de Poema 15

Me gustas cuando callas porque estás como ausente,
y me oyes desde lejos, y mi voz no te toca.
Parece que los ojos se te hubieran volado
y parece que un beso te cerrara la boca.

Como todas las cosas están llenas de mi alma
emerges de las cosas, llena del alma mía.
Mariposa de sueño, te pareces a mi alma,
y te pareces a la palabra melancolía.

Me gustas cuando callas y estás como distante.
Y estás como quejándote, mariposa en arrullo.
Y me oyes desde lejos, y mi voz no te alcanza:
déjame que me calle con el silencio tuyo.

Déjame que te hable también con tu silencio
claro como una lámpara, simple como un anillo.
Eres como la noche, callada y constelada.
Tu silencio es de estrella, tan lejano y sencillo.

Me gustas cuando callas porque estás como ausente.
Distante y dolorosa como si hubieras muerto.
Una palabra entonces, una sonrisa bastan.
Y estoy alegre, alegre de que no sea cierto.

jfp%



  1. Première solution

    On constate (sans pouvoir l'expliquer) la nécessité de marquer les sauts de ligne après le titre et après les vers
    de manière explicite par la balise <xsl:text> - alors que le saut de ligne qui précède le titre est fidèlement transmis.

    Neruda2txt-1.xsl

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

    <xsl:output  method="text" encoding="utf-8" />

    <xsl:template match="/">
    Visualisation de <xsl:value-of select="/poema/@titulo" /><xsl:text>

    </xsl:text>
        <xsl:apply-templates select="poema/estrofa" />
    </xsl:template>
       
    <xsl:template match="estrofa">   
        <xsl:apply-templates /><xsl:text>
    </xsl:text>
    </xsl:template>

    <xsl:template match="verso">   
        <xsl:value-of select="text()" /><xsl:text>
    </xsl:text>
    </xsl:template>

    </xsl:stylesheet>



  2. Utiliser &#10;

    De toute évidence, cette manière de commander des sauts de ligne surprend le lecteur et demande un commentaire.
    On peut faire plus lisible, en notant explicitement le caractère '\n' par son n° ASCII (qui est 10),
    avec l'entité prédéfinie &#10; - ou bien &#x0A; si vous préférez l'hexadécimal.

    Neruda2txt-2.xsl

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

    <xsl:output  method="text" encoding="utf-8" />

    <xsl:template match="/">
    Visualisation de <xsl:value-of select="/poema/@titulo" /><xsl:text>&#10;&#10;</xsl:text>
        <xsl:apply-templates select="poema/estrofa" />
    </xsl:template>
       
    <xsl:template match="estrofa">   
        <xsl:apply-templates /><xsl:text>&#10;</xsl:text>
    </xsl:template>

    <xsl:template match="verso">   
        <xsl:value-of select="text()" /><xsl:text>&#10;</xsl:text>
    </xsl:template>

    </xsl:stylesheet>



    C'est déjà mieux, mais...

  3. Définir une entité "intelligible"

    Il faut bien avouer que pour les gens que ne savent pas le code ASCII par cœur, cette notation est barbare !
    Une DTD locale va venir au secours de nos futurs lecteurs...

    Neruda2txt-3.xsl

    <?xml version='1.0'?>
    <!DOCTYPE xsl:stylesheet [
        <!ENTITY newline "&#10;">
    ]>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'>

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

    <xsl:template match="/">
    Visualisation de <xsl:value-of select="/poema/@titulo" /><xsl:text>&newline;&newline;</xsl:text>
        <xsl:apply-templates select="poema/estrofa" />
    </xsl:template>
       
    <xsl:template match="estrofa">           
        <xsl:apply-templates /><xsl:text>&newline;</xsl:text>
    </xsl:template>

    <xsl:template match="verso">   
        <xsl:value-of select="text()" /><xsl:text>&newline;</xsl:text>
    </xsl:template>

    </xsl:stylesheet>



    Notez que la déclaration "<!DOCTYPE stylesheet [... " sans préfixe est également acceptée sans discussion,
    ce qui est une entorse à la règle qui veut que les noms qui apparaissent dans la DTD soient verbatim ceux du texte XML,
    avec les mêmes préfixes.

  4. Allons plus loin ! Ne nous laissons pas arrêter par des tigres de papier...

    Oui, mais si nous voulons vraiment protéger nos lecteurs des aspérités de la technique, cachons aussi cette balise <xsl:text>
    dont nous ne sommes même pas capables de justifier la présence !

    Neruda2txt-4.xsl

    <?xml version='1.0'?>
    <!DOCTYPE xsl:stylesheet [
        <!ENTITY newline "<xsl:text>&#10;</xsl:text>">
    ]>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'>

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

    <xsl:template match="/">
    Visualisation de <xsl:value-of select="/poema/@titulo" />&newline;&newline;
        <xsl:apply-templates select="poema/estrofa" />
    </xsl:template>
       
    <xsl:template match="estrofa">           
        <xsl:apply-templates />&newline;
    </xsl:template>

    <xsl:template match="verso">   
        <xsl:value-of select="text()" />&newline;
    </xsl:template>

    </xsl:stylesheet>



    Ça c'est vraiment bien !
    Malheureusement xsltproc n'est pas d'accord :


    jfp% xsltproc  Neruda2txt-4.xsl ../Corpus/P15.xml
    namespace error : Namespace prefix xsl on text is not defined
    <xsl:text>
             ^

    Visualisation de Poema 15Me gustas cuando callas porque estás como ausente, y me oyes desde lejos, y mi voz no te toca. Parece que los ojos se te hubieran volado y parece que un beso te cerrara la boca. Como todas las cosas están llenas de mi alma emerges de las cosas, llena del alma mía. Mariposa de sueño, te pareces a mi alma, y te pareces a la palabra melancolía. Me gustas cuando callas y estás como distante. Y estás como quejándote, mariposa en arrullo. Y me oyes desde lejos, y mi voz no te alcanza: déjame que me calle con el silencio tuyo. Déjame que te hable también con tu silencio claro como una lámpara, simple como un anillo. Eres como la noche, callada y constelada. Tu silencio es de estrella, tan lejano y sencillo. Me gustas cuando callas porque estás como ausente. Distante y dolorosa como si hubieras muerto. Una palabra entonces, una sonrisa bastan. Y estoy alegre, alegre de que no sea cierto. jfp%



    Inutile de nous perdre en conjectures sur les raisons de ce comportement de xsltproc, il est tout simplement erroné !
    Il suffit de faire appel à un autre interprète autorisé, à savoir Java, pour s'en convaincre.
    D'ailleurs, il se peut que sur votre machine, la version de libxml2 soit plus récente que sur la mienne et que ce bug ait disparu.

    Pour observer un autre comportement erroné de xsltproc, dans Neruda2txt-3.xsl remplacez "&#10;" par "<br />",
    (ce qui n'a aucun intérêt pour engendrer du texte, puisque la balise ne sera pas transmise, mais qui pourrait servir pour du HTML).
    Chez moi j'ai un refus brutal de xsltproc devant "<xsl:text>&newline;</xsl:text>" :

    jfp% xsltproc Neruda2txt-5.xsl ../Corpus/P15.xml
    compilation error: file Neruda2txt-5.xsl line 10 element text
    xsltParseTemplateContent: xslt:text content problem
    compilation error: file Neruda2txt-5.xsl line 16 element text
    xsltParseTemplateContent: xslt:text content problem
    compilation error: file Neruda2txt-5.xsl line 20 element text
    xsltParseTemplateContent: xslt:text content problem
    jfp%


    Alors que Java l'exécute sans piper mot.
    Sur ce problème, voyez http://osdir.com/ml/gnome.lib.xslt/2002-12/msg00013.html
    qui annonce une correction... en 2002 !