8791 sujets

Développement web côté serveur, CMS

Bonjour,

J'aimerai refondre mon site en utilisant la techno XML/XSL. Pour cela, j'ai mis en place l'architecture suivante:

* Je génère du code XML en PHP
* Je créé le template en XSL
* Je combine les 2 via un script PHP

Mon problème est que j'arrive à transformer du XML "pur" via mon script php mais pas du XML généré.

Voici le fichier XML que je génère (http://www.milesteg.org/temp/test.php)

<?php
	header("Content-type: text/xml");
	print('<?xml version="1.0" encoding="iso-8859-1"?>');
?>
<root>
	<node><?php echo "test";?></node>
</root>


Voici le fichier XSL que j'utilise (http://www.milesteg.org/temp/test.xsl)

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
	<h1><xsl:value-of select="root/node"/></h1>
	aaa
</body>
</html>
</xsl:template>
</xsl:stylesheet>


Et voici le script PHP que j'utilise pour effectuer la transfo XML + XSL = HTML (http://www.milesteg.org/temp/template.php5)


<?php
	$filexml = 'test.php';
	$filexsl = 'test.xsl';

	$xml = new DomDocument; // from /ext/dom
	$xml->loadxml($filexml);
	
	$xsl = new DomDocument;
	$xsl->load($filexsl);
	// Configure the transformer
	$proc = new xsltprocessor;
	$proc->importStyleSheet($xsl); // attach the xsl rules
	echo $proc->transformToXML($xml); // actual transformation
?>


Lorsque j'execute tout ça, j'obtiens une erreur "Warning: DOMDocument::loadXML() [function.DOMDocument-loadXML]: Start tag expected, '<' not found in Entity, line: 1 in /home.10.4/milesteg/www/temp/template.php5 on line 9"

Auriez vous une piste pour m'aider à mettre tout ça en place?

D'avance merci Smiley cligne
Modifié par Miles Teg (25 Jul 2007 - 09:58)
Il va charger le fichier php comme ça, sans l'interpréter. Il faut donc d'abord interpréter le code pour ensuite l'ouvrir avec dom :
ob_start();
  require test.php;
  $content = ob_get_content();
ob_end_clean();

$xml = new DomDocument;
$xml->loadXml($content);
Merci beaucoup pour cette réponse.

Voici le code que j'utilise maintenant:

        $filexsl = 'test.xsl';
	ob_start();
		require 'test.php';
		$content = ob_get_contents();
	ob_end_clean();
	
	$xml = new DomDocument; 
	$xml->loadxml($content);
	
	$xsl = new DomDocument;
	$xsl->load($filexsl);
	// Configure the transformer
	$proc = new xsltprocessor;
	$proc->importStyleSheet($xsl);
	header("Content-type: text/html");
	echo $proc->transformToXML($xml);


Une chose étrange cependant: je suis obligé de mettre un header("Content-type: text/html"); avant l'affichage de la transformation. Est-ce normal?

Par ailleurs, niveau sécurité, je compte utiliser ce "moteur" pour transformer l'ensemble des pages de mon site (ex: article.php, forum.php etc...). Le fait d'utiliser un require n'est-il pas dangereux?
Il n'y a pas d'autres possibilités que d'utiliser un require + output buffering pour récupérer le résultat Smiley smile

Pour le header, c'est normal. T'as mis un header avec content-type xml dans ton test.php, donc forcément le navigateur va croire que c'est de l'xml. Vire ce header, il ne sert à rien.