Page 1 sur 1

Créer et manipuler des variables en XML et XSL ?

Posté : 26 août 2005, 14:47
par Spylberg
Je cherche à déclarer des variables, mais g l'impression que c plus complexe que le php!
Je ne m'en sors pas!

A partir de php, je genere un fichier xml, jusqu'ici tout va bien.

Les données xml sont à chaque fois les meme, mais je voudrai changer jsute le titre de la page xml...

Comment faire pr recuperer une donnée une seule fois sans faire de boucle xsl:for-each ?

Merci!

Posté : 26 août 2005, 14:48
par Spylberg
Voici mon code:
<?php	
///////////////////////////////////////////////////////////////////////////
// Génération du fichier XML !
///////////////////////////////////////////////////////////////////////////

  	// Requete
	$sqlxml = " SELECT * FROM produits WHERE nouvproch=1 ORDER BY id DESC LIMIT 0,10 ";
  	// Execute la requete
	$resultxml = mysql_query($sqlxml) or die('Erreur SQL : <br />'.$sqlxml);
	$nbresultxml = mysql_num_rows($resultxml);

if ($nbresultxml != 0) { 
$file= fopen("xml/nouveaute.xml", "w"); 
$_xml ="<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\r\n";
$_xml .="<?xml:stylesheet type=\"text/xsl\" href=\"formatage_xml.xsl\" ?>\r\n";
$_xml .="<!DOCTYPE LISTPROD SYSTEM \"docdtd.dtd\">\r\n\n";

$_xml .="<LISTPROD>\r\n"; 
$_xml .="\t\t<TYPEXML>[ | Flux XML | Nouveauté ]</TYPEXML>\r\n"; 

while ($dataxml = mysql_fetch_array($resultxml)) { 

// formatage du descriptif
$remplace = array("<br>","_");
$par = array(""," ");
$nvdesc = str_replace($remplace,$par,substr($dataxml["descriptif"],0,420)).'...[...]';
$nvnomcat = ucwords(str_replace($remplace,$par,$dataxml["cat"]));

if ($dataxml["id"]) {

$_xml .="\t\t<PRODUIT>\r\n";

$_xml .="\t\t<ID>".$dataxml["id"]."</ID>\r\n"; 

$_xml .="\t\t<FAMILLE>".$dataxml["famille"]."</FAMILLE>\r\n"; 
$_xml .="\t\t<LIENFAMILLE>".urlencode($dataxml["famille"])."</LIENFAMILLE>\r\n"; 

$_xml .="\t\t<CATEGORIE>".$nvnomcat."</CATEGORIE>\r\n"; 
$_xml .="\t\t<LIENCATEGORIE>".$dataxml["cat"]."</LIENCATEGORIE>\r\n"; 

$_xml .="\t\t<SOUSCATEGORIE>".$dataxml["souscat"]."</SOUSCATEGORIE>\r\n"; 
$_xml .="\t\t<LIENSOUSCATEGORIE>".urlencode($dataxml["souscat"])."</LIENSOUSCATEGORIE>\r\n"; 

$_xml .="\t\t<REFERENCE>".$dataxml["ref"]."</REFERENCE>\r\n"; 
$_xml .="\t\t<ACCROCHE>".$dataxml["titre"]."</ACCROCHE>\r\n"; 
$_xml .="\t\t<DESCRIPTIF>".htmlspecialchars($nvdesc, ENT_NOQUOTES)."\n</DESCRIPTIF>\r\n"; 
$_xml .="\t\t<NOMBREVU>".$dataxml["nbrvu"]."</NOMBREVU> "; 
$_xml .="\t\t<LIEN>".$dataxml["www"]."</LIEN> "; 
$_xml .="\t\t<MARQUE>".$dataxml["marque"]."</MARQUE>\r\n"; 
$_xml .="\t\t<PHOTO>".$dataxml["visuel"]."</PHOTO>\r\n"; 
$_xml .="\t\t<ZOOM>".$dataxml["zoom"]."</ZOOM>\r\n"; 

$_xml .="\t\t</PRODUIT>\r\n";

} else { 

$_xml .="\t<ID title=\"Plus rien dans la base\">\r\n"; 
$_xml .="\t\t<REFERENCE>Aucune</REFERENCE>\r\n"; 
$_xml .="\t</ID>\r\n"; 

	} 
} 

$_xml .="</LISTPROD>"; 

fwrite($file, $_xml); 
fclose($file); 
echo "<br><br><a href=\"xml/nouveaute_nemo.xml\" target=\"_blank\"><img src=\"http://www./v2/pics/rss1.gif\" border=\"0\"></a>"; 
} 
else { 
echo "no XML"; 

} 

?>

Posté : 26 août 2005, 14:58
par Spylberg
Et celui du 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:output encoding="iso-8859-1" method="html"/>
<xsl:template match="/">

<html>

<head>

<xsl:for-each select="LISTPROD/PRODUIT">

<title>
<xsl:value-of select="TYPEXML"/>
</title>

</xsl:for-each>

<!--OFFLINE-->
<style media="all" type="text/css">
@import url(../css/nemostyle.css);
</style>

</head>

<body bgcolor="#333333" background="pics/bg_xml.gif" bgproperties="fixed">

<table align="center" width="100%">
<tr>
<td align="center" valign="top">

<div class="frame">

<div class="content">
<font size="+1"><b>

</b></font>
</div>
<xsl:value-of select="REFERENCE"/>
<br/>
<br/>

<!--On fait une boucle pr lister le fichier XML-->
<xsl:for-each select="LISTPROD/PRODUIT">

<div class="content">

<a>
<xsl:attribute name="href">
http://www.nemo-fr.com/v2/index.php?rubrique=ficheproduit&id=<xsl:value-of select="ID"/>
</xsl:attribute>
<xsl:attribute name="target">
_blank
</xsl:attribute>

<img class="imgxml">
<xsl:attribute name="src">
/produit/mini/<xsl:value-of select="PHOTO"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:value-of select="REFERENCE"/> | Cliquez pour le Détail
</xsl:attribute>
<xsl:attribute name="border">
0
</xsl:attribute>
</img>

</a>

<b>
<xsl:value-of select="MARQUE"/> | <xsl:value-of select="CATEGORIE"/> | <xsl:value-of select="REFERENCE"/>
</b>
<br/>
<xsl:value-of select="DESCRIPTIF"/>

<span>
<br/>
<a>
<xsl:attribute name="href">
http://www.nemo-fr.com/v2/index.php?rubrique=ficheproduit&id=<xsl:value-of select="ID"/>
</xsl:attribute>
<xsl:attribute name="target">
_blank
</xsl:attribute>
<img src="http://www.nemo-fr.com/v2/pics/puce.gif" border="0"></img> Voir sur Nemo-Fr.com
</a>

</span>

<br/><br/>
</div>

<!--Fin de la boucle-->
</xsl:for-each>

</div>

</td></tr></table>

</body>
</html>

</xsl:template>
</xsl:stylesheet>

[/php]

Posté : 26 août 2005, 15:10
par h2o
Voici un exemple de xsl où j'ai envoyé une variable/paramètre, dans ce cas : "titre".
Je récupère ce paramètre au plus haut niveau.
Ensuite, je peux l'utiliser exactement comme dans php : le nom, précédé du signe "$".


Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output encoding="iso-8859-1" indent="yes" method="xml" omit-xml-declaration="yes" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/> <xsl:param name="titre"/> <xsl:template match="/"> <html> <head> <title> <xsl:value-of select="$titre"/> </title> </head> <body> <!-- --> </body> </html> </xsl:template> </xsl:stylesheet>
Ensuite, mon code php (DOM version 5 !) ressemble à ceci (c'est du copié-collé depuis le site php.net) :
<?php
$titre = "mon titre - ou tout ce que tu veux";
/* load the xml file and stylesheet as domdocuments */ 
$xsl = new DomDocument(); 
$xsl->load('doc.xsl'); 
$inputdom = new DomDocument(); 
$inputdom->load('doc.xml'); 
/* create the processor and import the stylesheet */ 
$proc = new XsltProcessor(); 
$xsl = $proc->importStylesheet($xsl); 
$proc->setParameter(null, "titre", $titre); 
/* transform the xml document */ 
$newdom = $proc->transformToXml($inputdom); 
/* eval and output the xml */
$newdom = eval("?".chr(62).$newdom.chr(60)."?");
?>
Le "eval" en fin de code permet de faire évaluer le document xml généré comme si c'était du php : en effet, je place du code php dans mon document xsl. Ce qui me permet, par exemple, de faire un "include".

Posté : 26 août 2005, 15:21
par h2o
Nos messages ont du se croiser un peu.

Tu n'as pas besoin de mettre une boucle for-each pour générer le titre. Si celui-ci est le même dans chaque "PRODUIT", tu peux écrire ceci :

Code : Tout sélectionner

<head> <title> <xsl:value-of select="LISTPROD/PRODUIT[1]/TYPEXML"/> </title> </head>
Tu prends alors le contenu du noeud "TYPEXML" du premier noeud "PRODUIT"

<edit>
Si tu as plusieurs "PRODUIT", ton code va produire autant de "titre" que de "PRODUIT"

J'ai quelques problème avec tes codes : pourrais-tu poster le code xml généré par ton php et pas le code php.
Ce sera plus facile pour moi de corriger le xsl.

</edit>

Posté : 26 août 2005, 15:44
par Spylberg
Nos messages ont du se croiser un peu.

Tu n'as pas besoin de mettre une boucle for-each pour générer le titre. Si celui-ci est le même dans chaque "PRODUIT", tu peux écrire ceci :

Code : Tout sélectionner

<head> <title> <xsl:value-of select="LISTPROD/PRODUIT[1]/TYPEXML"/> </title> </head>
Tu prends alors le contenu du noeud "TYPEXML" du premier noeud "PRODUIT"

<edit>
Si tu as plusieurs "PRODUIT", ton code va produire autant de "titre" que de "PRODUIT"

J'ai quelques problème avec tes codes : pourrais-tu poster le code xml généré par ton php et pas le code php.
Ce sera plus facile pour moi de corriger le xsl.

</edit>
Heu.....

Chez moi ça ne marche pas!?

Comprend pas!

En fait <TYPEXML> n'est déclaré qu'une seule fois puisque avant la boucle while en php.

Je peux donc je pense la declarer comme ça:
<xsl:value-of select="LISTPROD/PRODUIT/TYPEXML"/>

Mais ça ne fonctionne pas...

Posté : 26 août 2005, 15:48
par Spylberg
dsl, les posts se sont encore croisés!

voici le xml généré:

Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1" ?> <?xml:stylesheet type="text/xsl" href="formatage_xml.xsl" ?> <LISTPROD> <TYPEXML>[| Flux XML | Nouveauté ]</TYPEXML> <PRODUIT> <ID>1544</ID> <FAMILLE>logiciels</FAMILLE> <LIENFAMILLE>logiciels</LIENFAMILLE> <CATEGORIE>Antivirus</CATEGORIE> <LIENCATEGORIE>antivirus</LIENCATEGORIE> <SOUSCATEGORIE>Logiciels (Antivirus)</SOUSCATEGORIE> <LIENSOUSCATEGORIE>Logiciels+%28Antivirus%29</LIENSOUSCATEGORIE> <REFERENCE>BITDEFENDER 9 Standard</REFERENCE> <ACCROCHE>Le BitDefender Nouveau arrive ! [Sortie le 16 Août]</ACCROCHE> <DESCRIPTIF>EFFICACITE ! 100% de détection et de désinfection, pour éradiquer tous les codes malveillants en circulation, quelque soit la voie d'accès, y compris via les échanges P2P. REACTIVITE ! Mises à jour automatiques et gratuites, toutes les heures, pendant 1 ANS, de la base virale ET du moteur. INCLUS : Assistance technique par téléphone, email et chat online 7j/7 - 24h/24. NOUVELLES FONCTIONNALITES ! Technologi...[...] </DESCRIPTIF> <NOMBREVU>9</NOMBREVU> <LIEN>http://www.editions-profil.fr/</LIEN> <MARQUE>Editions Profil</MARQUE> <PHOTO>BitDefenderStd9.jpg</PHOTO> <ZOOM>BitDefenderStd9.jpg</ZOOM> </PRODUIT>

Posté : 26 août 2005, 15:51
par Spylberg
C bon!

G trouvé la solution en regardant mon post! LOL :lol: (comme quoi...)

Ce n'etait pas:
<xsl:value-of select="LISTPROD/PRODUIT/TYPEXML"/>
Mais:
<xsl:value-of select="LISTPROD/TYPEXML"/>

Héhé :wink:

Ainsi je peux me servir de chaque noeud xml comme ça? c ça?

Merci !!!!!

@+

Posté : 26 août 2005, 16:05
par h2o
Voici un extrait du code corrigé :

Code : Tout sélectionner

<head> <title> <xsl:value-of select="LISTPROD/TYPEXML"/> </title> <!--OFFLINE--> <style media="all" type="text/css"> @import url(../css/nemostyle.css); </style> </head>
Mais ceci ne solutionne pas l'envoi d'une variable.
Personnellement, je ne déclare pas ma feuille de style dans mon document xml

Code : Tout sélectionner

<?xml:stylesheet type="text/xsl" href="formatage_xml.xsl" ?
Même si IE fait le travail, d'autres navigateur non.
Et surtout, le code envoyé par le "trio" php-xl-xsl est déjà formaté en html ou xhtml.

Posté : 26 août 2005, 16:09
par Spylberg
Alors où la déclare tu?

Posté : 26 août 2005, 16:09
par h2o
Ce n'etait pas:
<xsl:value-of select="LISTPROD/PRODUIT/TYPEXML"/>
Mais:
<xsl:value-of select="LISTPROD/TYPEXML"/>

Héhé :wink:

Ainsi je peux me servir de chaque noeud xml comme ça? c ça?
"A la bonne heure" comme l'aurais dis feu mon grand-père.

Oui. Et dans ton cas, si tu n'as pas plus d'un "produit", tu peux te passer de la boucle "for-each".

Posté : 26 août 2005, 16:22
par h2o
Alors où la déclare tu?
Regarde mon premier post dans ce fil.

Tu peux placer ton xml calculé dans une variable $xml

Dans mon code (php 5), tu remplaces
$inputdom->load('doc.xml');
par
$inputdom->loadXML($xml);
$xsl->load('doc.xsl');
est le chemin vers ton document xsl.