XSL Processing Instruction

ViPHP
ViPHP | 4674 Messages

16 mars 2008, 18:08

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 :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

16 mars 2008, 19:47

J'ai pas tout suivi, tu pourrais faire une démo avec un .xml et un .xsl minimalistes stp ?

ViPHP
ViPHP | 4674 Messages

16 mars 2008, 19:53

Voici mon code XML :

Code : Tout sélectionner

<programlisting role="php"> <?php $var = array(); ?>
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>
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

16 mars 2008, 20:09

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>

ViPHP
ViPHP | 4674 Messages

16 mars 2008, 20:20

Ç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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

16 mars 2008, 20:28

Ç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.

ViPHP
ViPHP | 4674 Messages

16 mars 2008, 20:42

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 :

Code : Tout sélectionner

<programlisting role="xml">
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 ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

16 mars 2008, 21:00

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())
Modifié en dernier par Hubert Roksor le 16 mars 2008, 21:06, modifié 1 fois.

ViPHP
ViPHP | 4674 Messages

16 mars 2008, 21:06

C'est pas un peu lourd un eval sur des pages de 80 Ko ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

16 mars 2008, 21:08

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.

ViPHP
ViPHP | 4674 Messages

16 mars 2008, 21:10

Je tenterai tout ça demain en fin de journée si possible :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).