Page 1 sur 1
XSL Processing Instruction
Posté : 16 mars 2008, 18:08
par Hywan
Bonjour tout le monde

.
J'utilise DocBook et les PIs (Processing Instruction) pour écrire du code (la colorisation se fait via PHP). Problème, il m'arrive d'écrire <? et ?> dans le code qui se trouve dans les PIs.
En fait, j'écris <?php et ?>. Le <?php se voit transformé en <?php et je n'ai pas de problème. En revanche, ?> devient ?> mais il braille quand même. Pour lui, ?> = ?> et c'est plutôt gênant. Voici l'erreur pour les petits curieux :
Code : Tout sélectionner
xsl:processing-instruction: '?>' not allowed within PI content
Comment réussir à écrire ce symbole "?>" dans des PIs ? Sachant que j'ai essayé de transformer les chevrons et les points d'interrogations en entités HTML.
Merci

.
Posté : 16 mars 2008, 19:47
par Hubert Roksor
J'ai pas tout suivi, tu pourrais faire une démo avec un .xml et un .xsl minimalistes stp ?
Posté : 16 mars 2008, 19:53
par Hywan
Voici mon code XML :
Je sais, le ?gt; n'est pas obligatoire, mais c'est juste pour l'exemple

.
Et voici le code XSL :
Code : Tout sélectionner
<xsl:template match="programlisting">
<xsl:variable name="pl">
<xsl:apply-templates />
</xsl:variable>
<xsl:variable name="role" select="@role" />
<xsl:processing-instruction name="php">
<xsl:text>
include_once '/usr/share/xml/docbook/php/geshi.php';
$source = '</xsl:text><xsl:value-of select="$pl" /><xsl:text>';
$language = '</xsl:text><xsl:value-of select="$role" /><xsl:text>';
$geshi = new GeSHi(trim($source), $language);
echo $geshi->parse_code();
</xsl:text>
</xsl:processing-instruction>
</xsl:template>
Posté : 16 mars 2008, 20:09
par Hubert Roksor
Hmm, je doute que cela soit possible avec cette approche. Il te faudrait essayer avec <xsl:output type="text"> mais tu ne pourras pas utiliser certains éléments, notamment <xsl:processing-instruction> (logique, les PI sont un concept propre au XML)
Code : Tout sélectionner
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />
<xsl:template match="programlisting">
<xsl:variable name="pl">
<xsl:apply-templates />
</xsl:variable>
<xsl:variable name="role" select="@role" />
<xsl:text><?php
include_once '/usr/share/xml/docbook/php/geshi.php';
$source = '</xsl:text><xsl:value-of select="$pl" /><xsl:text>';
$language = '</xsl:text><xsl:value-of select="$role" /><xsl:text>';
$geshi = new GeSHi(trim($source), $language);
echo $geshi->parse_code();
?></xsl:text>
</xsl:template>
</xsl:stylesheet>
Posté : 16 mars 2008, 20:20
par Hywan
Ça ne marche pas, et c'est plutôt logique dans un sens.
Le but des PIs est d'exécuter du code <?, donc si on écrit <?php, il va écrire <?php mais ne va pas l'exécuter, ce sera du texte.
Donc non, ça ne marche pas, mais bel essaie, j'y avais cru.
En fait, les PIs n'exécutent pas le code directement, elles se contentent d'écrire <?... ... ?>. Avec notre méthode, on a écrit <... ... ?>. Le résultat s'affichera sans s'exécuter.
Posté : 16 mars 2008, 20:28
par Hubert Roksor
Ça ne marche pas
Je ne suis pas sûr de comprendre, chez moi ça marche donc on doit avoir des objectifs différents.
<?php
$xml = new DOMDocument;
$xml->loadXML('<?xml version="1.0" encoding="utf-8"?><programlisting role="php">
<?php
$var = array();
?>
</programlisting>');
$xsl = new DOMDocument;
$xsl->loadXML('<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />
<xsl:template match="programlisting">
<xsl:variable name="pl">
<xsl:apply-templates />
</xsl:variable>
<xsl:variable name="role" select="@role" />
<xsl:text><?php
include_once \'/usr/share/xml/docbook/php/geshi.php\';
$source = \'</xsl:text><xsl:value-of select="$pl" /><xsl:text>\';
$language = \'</xsl:text><xsl:value-of select="$role" /><xsl:text>\';
$geshi = new GeSHi(trim($source), $language);
echo $geshi->parse_code();
?></xsl:text>
</xsl:template>
</xsl:stylesheet>');
$xslt = new XSLTProcessor;
$xslt->importStylesheet($xsl);
echo $xslt->transformToXML($xml);
...génère bien
<?php
include_once '/usr/share/xml/docbook/php/geshi.php';
$source = '
<?php
$var = array();
?>
';
$language = 'php';
$geshi = new GeSHi(trim($source), $language);
echo $geshi->parse_code();
?>
les PIs n'exécutent pas le code directement [...] Le résultat s'affichera sans s'exécuter.
De quel code parles-tu ? Effectivement, XSLT n'
exécute aucune sorte de code. Une fois la transformation effectuée, libre à toi d'interpréter le résultat, par exemple avec eval() si nécessaire.
Posté : 16 mars 2008, 20:42
par Hywan
Voilà ce que je fais avec programlisting.
J'utilise <programlisting> pour coloriser une source. Le langage contenu dans programlisting est précisé à travers l'attribut @role :
par exemple.
Pour coloriser, je génère un code PHP qui va lancer un script GeSHi. J'avoue donc que mon exemple était mal choisi. J'en propose un autre :
Code : Tout sélectionner
<programlisting role="xml">
<xml encoding="utf-8" version="1.0"?>
</programlisting> lancera une erreur. Car ?> n'est pas accepté dans un PI.
Ce que fait mon premier code XSL, il va écrire un code PHP qui va coloriser un chaîne de caractère (ici <?xml encoding.... .0"?>). Après que DocBook ait parser mon code et m'ait écrit des fichiers HTML, j'utilise PHP pour analyser tous les fichiers et exécuter les codes PHP à l'intérieur (donc coloriser les codes de programlisting). Est-ce que tu comprends un peu plus ?
Posté : 16 mars 2008, 21:00
par Hubert Roksor
Donc ça correspond à ce que je disais plus haut, tu fais ta transformation en générant du texte, et ensuite tu fais passer le tout dans eval(). Qu'est-ce qui ne va pas avec cette approche ?
Au pire, ce que j'essaierais de faire à ta place*, c'est utiliser
registerPHPFunctions() pour tout faire en une passe, en économisant toute la procédure d'échappement nécessaire pour mettre du code PHP dans une variable PHP générée par XSLT.
* en supposant que ta transformation est trop complexe pour être effectuée "à la main" en PHP (eg, un foreach sur xpath())
Posté : 16 mars 2008, 21:06
par Hywan
C'est pas un peu lourd un eval sur des pages de 80 Ko ?
Posté : 16 mars 2008, 21:08
par Hubert Roksor
Dans la mesure où 79 de tes 80 Ko sont une chaîne, on s'en fiche, le parsing est rapide et l'exécution est à peu près la même que le code d'un fichier quelconque. Le truc qui va ramer dans l'histoire, c'est GeSHI.
Posté : 16 mars 2008, 21:10
par Hywan
Je tenterai tout ça demain en fin de journée si possible

.