Bonjour.

J'apprends actuellement le xsl, et je rencontre un problème bizarre lors d'un essai de transformation via php.

Tout d'abord, voici mes trois fichiers:

Le fichier xml, xmldoc.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<musique>
	
	<album annee="2003">
		<auteur src="http://www.brandnewrock.com">Brand new</auteur>
		<titre>Deja Entendu</titre>
	</album>
	
	<album annee="2004">
		<auteur src="http://www.carajo.com.ar">Carajo</auteur>
		<titre>Atrapasuños</titre>
	</album>
	
	<album annee="2000">
		<auteur src="http://www.gorillaz.com">Gorillaz</auteur>
		<titre>Gorillaz</titre>
	</album>
	
	<album annee="2003">
		<auteur src="http://www.yellowcardrock.com">Yellowcard</auteur>
		<titre>Ocean avenue</titre>
	</album>
	
</musique>


Le fichier xsl, styles.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="//album">
		<h3>
			<xsl:value-of select="./auteur" />
		</h3>
		
		<h4>
			<xsl:value-of select="./titre" /> 
			<xsl:if test="@annee">
				(<xsl:value-of select="@annee" />)
			</xsl:if>
		</h4>
		
		<p><a href="{./auteur/@src}">Site officiel</a> de <xsl:value-of select="./auteur" />.</p>
		
		<hr />
	</xsl:template>
	
</xsl:stylesheet>


Et le fichier php, exemple.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
	<head>
		<title>testing xml</title>
		<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"/>
		<meta http-equiv="content-style-type" content="text/css"/>
	</head>
	<body>
		
		<h1>Testing xml/xsl with php</h1>
		
		<h2>Mon album choisi:</h2>
		
		<div id="album-zone">
			<?php
				// création du processeur Xsl					
					$xslProc = xslt_create();
				
				// chargement, transformation et affichage du document xml
					$transformedXml =  xslt_process($xslProc, "./xmldoc.xml", "./styles.xsl", NULL);
					
					if (empty($transformedXml)) {
						die('Erreur d\'analyse XSLT : '. xslt_error($xslProc));
					}
					
					//affichage
					print($transformedXml);
					
				
			?>
		</div>
		
	</body>
</html>


Le but étant donc, tout d'abord, d'afficher tous les albums (la finalité du script étant au final de pouvoir choisir l'album voulu via une liste, qui enverra au xsl le numéro d'ordre de la balise album voulue.

Seulement voilà, j'ai un problème.

Quand je teste la page en local, il affiche cette erreur:
a écrit :

Warning: Sablotron error on line none: cannot open file 'c:/wamp/apache/styles.xsl' in e:\wamp local server folder\xml test php 4\exemple.php on line 20
Erreur d'analyse XSLT : cannot open file 'c:/wamp/apache/styles.xsl'


et quand je l'affiche sur mon hébergeur web, ça marche (sauf que la fonction xslt_set_enconding, elle ne marche pas...).

Mais moi j'aimerai que ça marche en local, histoire de pouvoir faire autant de test que je veux pour arriver au résultat (et aussi pour pouvoir coder hors-ligne).

J'utilise Wamp Server, avec php 4.3.11, j'ai activé l'extention php_xslt et php_domxml, et j'ai copié les dll expat, inconv et sablot là où il le faut.

Avez-vous une idée du problème que je rencontre, et de sa solution ?

Merci beaucoup. Smiley smile
Modifié par Lisarael (07 Apr 2005 - 11:09)
Salut,

Le message d'erreur est tres explicite.

Warning: Sablotron error on line none: cannot open file 'c:/wamp/apache/styles.xsl' in e:\wamp local server folder\xml test php 4\exemple.php on line 20
Erreur d'analyse XSLT : cannot open file 'c:/wamp/apache/styles.xsl'


As tu essayer de mettre le chemin de ta feuille xslt comme ceci:
$_SERVER['DOCUMENT_ROOT'].'/repertoire/styles.xsl'


Il y a quelques differences entre un WAMP et un LAMP.
Surtout au niveau des la gestion des fichiers Smiley cligne

Cordialement,

FRed
Merci FRed, y a déjà du mieux, mais il remets une erreur que je ne comprends pas :


Warning: Sablotron error on line 1: XML parser error 4: not well-formed (invalid token) in e:\wamp local server folder\xml test php 4\exemple.php on line 20
Erreur d'analyse XSLT : XML parser error 4: not well-formed (invalid token)


Si je comprend bien, mon xml ou xsl est mal formé... seulement, j'ai rien changé aux sources que j'ai postées, et qui semblent plus que correctes... Smiley rolleyes Smiley ohwell
Ok,

J'ai deja rencontre ce probleme.

Pour resoudre ce point, supprime ceci dans la feuille xslt:
<?xml version="1.0" encoding="ISO-8859-1"?>

ou dans le xml, voir les deux lol

Un petit trou de mémoire Smiley cligne

FRed
Non, toujours pas.

Ni en le supprimant dans un, pis dans l'autre, ou dans les deux.

pas glop, ça... lol Smiley sweatdrop
Je suis bien désolé.
Dans l'immediat, je ne pourrais pas t'aider.
Mais plus tard dans la soirée, je configure un WAMP et je te tiens au courant.

Sinon, je te conseille de te renseigner sur des forums dédiés au php Smiley cligne

A+

FRed
merci bcp.

j'utilise Wamp5 avec l'extention pour faire le switch entre php5 et php4, et je reste en php4 pasque mon hébergeur est aussi en php4.
Je confirme que les fichiers xml et xsl sont corrects (testés avec les transformations xslt de Firefox, IE6, et libxslt via php4).

Il y a donc un pb localisé dans le fichier php. Peut-être une erreur dans la façon de donner le chemin d'un fichier au sein de la fonction xslt_process() ?

Pour information, Sablotron n'est plus au goût du jour dans PHP, il vaut mieux lui préférer la librairie libxslt. Elle est beaucoup plus performante, plus simple d'utilisation ...
Libxslt est la librairie choisie par PHP5, elle est également disponible sous php4 (options dom-xml et domxslt, (php_domxml.dll sous windows)).
Bonsoir.

Merci à Xavier qui m'a fait changer de librairie, plus facile à utilisé à mon goût.

Effectivement, il y avait un problème de nom de fichier. Etants sur mon disque dur, je dvait les appeller par leurs noms absolus précédés de file:///.

J'ai donc codé rapidement une petite routine pour ajouter le file:/// quand il le faut, et ne pas avoir à remodifier mon code quand je taperai mes fichiers en ligne:



// routine de création du chemin de fichier
						$path1 = $_SERVER['SCRIPT_FILENAME'];
						$regExp = "[A-Za-z0-9]*\.php";
						$path2 = spliti($regExp, $path1);
						
						$verif = substr($path2[0], 0, 3);
						
						if ($verif == "e:/"){
							$path = "file:///".$path2[0]; 
							}
						else {
							$path = "";
							}
						// quand on appelle un fichier, on l'écris ainsi : $path ."file.ext"
					// fin de routine de création du chemin de fichier



Voilà.

Mon problème peut être considéré comme résolu, mais j'aimerai qu'on réponde à une petite question avant que je le note dans mon titre de post:

Xavier, tu disais ceci dans ton post :

a écrit :

testés avec les transformations xslt de Firefox


Firefox permet de faire des transformations Xslt nativement ? ou il faut une extension ?
Pourrais-tu préciser un peu plus, je suis débutant en xsl.

En tout cas, merci à tous pour vos pistes, ça m'a bien aidé.
Il n'est pas nécessaire d'installer une extension pour disposer de la transformation XSLT sous Firefox. Il en est de même pour tous les navigateurs modernes.
Cette implémentation correspond à la vision d'une transformation XSL en tant que feuille de style de présentation d'un fichier XML. Le principe est identique quel que soit le navigateur : le fichier XML doit faire référence à la feuille de style, et il suffit d'ouvrir ce fichier XML dans le navigateur. Reprenant ton code, voici quelques modifications qui permettent de mettre ce principe en oeuvre :

Fichier XML :
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="fichier.xsl"?>
<musique>

 <album annee="2003">
<auteur src="http://www.brandnewrock.com">Brand new</auteur>
<titre>Deja Entendu</titre>
</album>

<album annee="2004">
<auteur src="http://www.carajo.com.ar">Carajo</auteur>
<titre>Atrapasuños</titre>
</album>

<album annee="2000">
<auteur src="http://www.gorillaz.com">Gorillaz</auteur>
<titre>Gorillaz</titre>
</album>

<album annee="2003">
<auteur src="http://www.yellowcardrock.com">Yellowcard</auteur>
<titre>Ocean avenue</titre>
</album>

</musique>
Fichier 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>
<xsl:apply-templates/>
</html>
</xsl:template>

<xsl:template match="//album">
<h3>
<xsl:value-of select="./auteur" />
</h3>

<h4>
<xsl:value-of select="./titre" />
<xsl:if test="@annee">
(<xsl:value-of select="@annee" />)
</xsl:if>
</h4>

<p><a href="{./auteur/@src}">Site officiel</a> de <xsl:value-of select="./auteur" />.</p>

<hr />
</xsl:template>

</xsl:stylesheet>


Concernant ton code php, je crois que tu pourrais te simplifier la vie si tu accédais à tes fichiers locaux en tant que ressources web (puisque ta plateforme php est installée avec Apache). Voici un petit moteur XSLT exploitant libxslt sous php4, pas de problème de chemin :
<?php

//désignation des fichiers utiles
$the_root=$_SERVER["DOCUMENT_ROOT"].'/';		//répertoire racine du serveur
$xml_file = $the_root.'mon-chemin/mon-fichier.xml';			// fichier xml de contenu
$xsl_file = $the_root.'mon-chemin/mon-fichier.xsl';		// transformation xsl 

// chargement des fichiers
$DomXmlFile = domxml_open_file($xml_file);
$DomXslTrans = domxml_xslt_stylesheet_file($xsl_file);

//paramètres de transformation
//$PARAM['xx']="";

//application de la transformation et envoi à l'internaute
$DomXmlFileResult=$DomXslTrans->process($DomXmlFile,$PARAM);	// le miracle de la transformation XSLT
$XmlFileResult= $DomXmlFileResult->dump_mem(true);		// l'objet DOM devient chaîne
print $XmlFileResult;							// l'internaute reçoit la page
?>

Modifié par Xavier (08 Apr 2005 - 15:50)