8797 sujets

Développement web côté serveur, CMS

Bonjour,

je rencontre un problème bizarre lors d'un essai de transformation via php d'un xml en xsl.
Tout d'abord, voici mes trois fichiers:

<?php
require 'class.php'; // classe sablotron

# Création de l'objet XS
$XS = new xslt('ex1.xml','ex2.xsl',true,'sablotron');

# Transformation
$XS->transform();

# Affichage du résultat
echo $XS->output();
?>


le fichier "ex2.xsl"

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/"> 
<html> 
<body>
<table border="1" cellspacing="0" cellpadding="3">
<tr bgcolor="#FFFF00"> 
<td>Artiste</td> 
<td>Titre</td> 
</tr> 
<xsl:for-each select="compilation/mp3">
	<xsl:choose> 
		<xsl:when test=".[artiste='Alain Souchon']">
			<tr bgcolor="#00FF00"> 
				<td><xsl:value-of 

select="titre"/></td>
				<td><xsl:value-of 

select="artiste"/></td> 
			</tr> 
		</xsl:when> 
		<xsl:otherwise> 
		<tr> 
			<td><xsl:value-of select="titre"/></td>
			<td><xsl:value-of 

select="artiste"/></td>
		</tr> 
		</xsl:otherwise> 
	</xsl:choose> 
</xsl:for-each> 
</table>
</body>
</html>
</xsl:template> 
</xsl:stylesheet>


le fichier "ex1.xml"

<?xml version="1.0"?> 
<compilation> 
	<mp3>
		<titre>Foule sentimentale</titre>
		<artiste>Alain Souchon</artiste> 
	</mp3>
	<mp3> 
		<titre>Solaar pleure</titre>
		<artiste>MC Solaar</artiste> 
	</mp3>
	<mp3> 
		<titre>Le baiser</titre> 
		<artiste>Alain Souchon</artiste> </mp3> 
	<mp3>
		<titre>Pourtant</titre>
		<artiste>Vanessa Paradis</artiste>
    </mp3>
	<mp3>
		<titre>Chambre avec vue</titre> 
		<artiste>Henri Salvador</artiste> 
	</mp3>
</compilation>


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

Error 3, Level 0

msgtype : error
code : 4
module : Sablotron
URI : arg:/_xsl
line : 22
msg : cannot open file 'C:/APACHE/Apache2/ex1.xml'



J'utilise php 4.3.10.10, 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,
Modifié par kebab4 (28 Apr 2005 - 14:07)
Administrateur
Salut kebab4 et bienvenue ici Smiley smile

Pourrais-tu s'il te plaît relire les Règles du Forum et mettre en pratique le passage suivant ?
Aide/Règle a écrit :
13- Mise en forme générale des messages

Merci de bien vouloir prendre le temps de présenter correctement vos messages, surtout si ces messages doivent inciter les autres membres à vous dépanner sur un problème. Des boutons de mise en forme sont prévus pour cela (gras, italique, etc.). Merci de systématiquement baliser vos codes HTML ou CSS avec le bouton CODE approprié (éviter également, pour des questions de lisibilité, de présenter des codes HTML et PHP imbriqués). Enfin, n'hésitez pas à toujours fournir une image explicative et une url où les membres auront un aperçu de votre problème.


Merci d'avance et bonne chance Smiley smile
Modifié par Raphael (28 Apr 2005 - 11:53)
Plusieurs erreurs sont présentes dans ton code xsl. Sur l'élément stylesheet il faut indiquer la version, et un namespace correct :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
Par ailleurs ton test 'Alain Souchon' n'en est pas un. Voici ce qu'il te faut :
<xsl:when test="./artiste='Alain Souchon'">

Modifié par Xavier (28 Apr 2005 - 16:46)
j ai essayé de corriger l'élement stylesheet :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

et le test :
<xsl:when test="./artiste='Alain Souchon'"> 

comme il faut et ca marche tjrs pas,en plus si l'on exécute les deux fichiers xml et xsl -que j ai téléchargé sur internet seulement pour tester la classe sablotron que j' ai télécharge aussi sur le net- avec le programme ci-dessous marchent bien donc le probléme si pas dans les deux fichiers xml et xsl.
<html>
<body> 
<script type="text/javascript"> 
// chargement du fichier XML
var xml = new ActiveXObject("Microsoft.XMLDOM") 
xml.async = false 
xml.load("ex1.xml") 
// chargement du fichier XSL 
var xsl = new ActiveXObject("Microsoft.XMLDOM") 
xsl.async = false 
xsl.load("ex2.xsl")
// transformation en Html
document.write(xml.transformNode(xsl)) 
</script>
</body>
</html> 

Modifié par kebab4 (29 Apr 2005 - 09:12)
kebab4 a écrit :
cannot open file 'C:/APACHE/Apache2/ex1.xml

L'erreur PHP me semble plutot claire non ? PHP n'est pas capable d'ouvrir ton fichier ex1.xml. Les raisons peuvent etre divers est variées, mais la plus courante est que le chemin d'accès vers ton fichier n'est pas bon ! Essaye de lui donner un chemin absolue plutot qu'un chemin relatif
Smiley cligne

Note : Comme il s'agit d'un problème de PHP et pas de XML, je déplace ton sujet dans la bonne salle Smiley smile
je ne croit pas que le probléme est dans le chemin absolu du fichier xml car j'ai copie le contenu du xml dans un variable puis je le transmis directement vers la fonction xslt() :
<?php
require 'class.php';

$filename = "ex1.xml";
$handle = fopen ($filename, "r");
$contentsxml = fread ($handle, filesize ($filename));
fclose ($handle);

# Création de l'objet XS
$XS = new xslt($contentsxml,'ex2.xsl',true,'sablotron');

# Transformation
$XS->transform();

# Affichage du résultat
echo $XS->output();
?>

et voila l'erreur que j'ai :
Error 3, Level 0

msgtype : error
code : 4
module : Sablotron
URI : arg:/_xsl
line : 22
msg : cannot open file '...re> <artiste>Vanessa Paradis</artiste> </mp3> <mp3> <titre>Chambre avec vue</titre> <artiste>Henri Salvador</artiste> </mp3> </compilation>'

Modifié par kebab4 (29 Apr 2005 - 09:45)
kebab4 a écrit :
cannot open file '...re> <artiste>Vanessa Paradis</artiste> </mp3> <mp3> <titre>Chambre avec vue</titre> <artiste>Henri Salvador</artiste> </mp3> </compilation>'[/code]


Bon, visiblement, tu utilise un class PHP4 pour utiliser XSLT. L'erreur ci-dessus me parait extraiement claire : Le premier argument de ton constructeur doit etre un chemin d'accès vers le fichier à ouvrir et pas le contenu du fichier lui même !

"cannot open file" veux dire "impossible d'ouvrir le fichier" donc, ça veut dire que PHP ne peut pas accéder au fichier (chemin incorrecte) ou n'a pas les droit necessaire pour l'ouvrir !

Dans ta première erreur :
a écrit :
cannot open file 'C:/APACHE/Apache2/ex1.xml


PHP essayer d'ouvrir le fichier ex1.xml present dans le dossier Apache2 lui-même present dans le dossier APACHE à la racine de C:\

Est-ce que ton fichier ce trouve bien à cette endroit ? Connaissant Apache, et vu que tu utilisais un chemin relatif, je suis assez étonné de ne pas trouver un httpdocs, un www ou un truc du genre dans le chemin d'accès !

Smiley confus
Modifié par Jep (29 Apr 2005 - 09:53)
j'ai mis les deux fichiers xml et xsl au même temps dans les répertoires c:/apache, c:/apache/apache2, c:/apache/apache2/htdocs et dans le dossier real c:/web/test/ . et ca marche toujours pas.Est ce que la classe sablotron à une relation avec les version de php? marche pour une version et ne marche pas pour l'autre?
Modifié par kebab4 (29 Apr 2005 - 10:14)
ca marche pas du tout si je précéde l'adresse des fichiers par le protocole file:/// et voila les erreurs :
Warning: fopen(file:///C:\web\test\zipsource.XSLT\ex2.xsl): failed to open stream: Invalid argument in C:\web\test\zipsource.XSLT\class.php on line 308

Warning: fread(): supplied argument is not a valid stream resource in C:\web\test\zipsource.XSLT\class.php on line 309

Warning: fclose(): supplied argument is not a valid stream resource in C:\web\test\zipsource.XSLT\class.php on line 310

Error 3, Level 0

msgtype : error
code : 2
module : Sablotron
URI : arg:/_xsl
line : 1
msg : XML parser error 3: no element found