Variations sur l'affichage des poèmes :
engendrer du texte / utiliser
des entités
Cours M2-IM/XML du 27/10/2011
- Première solution
- Utiliser
- Définir une entité "intelligible"
- 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%
-
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>
-
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
- ou bien &#
x
0A;
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> </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>
C'est déjà mieux, mais...
-
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 " ">
]>
<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.
-
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> </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 "
"
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 !