Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > XSL & XSLT
XSL & XSLT Forum d'entraide pour les extensions XSL et XSLT permettant de manipuler vos documents XML à l'aide de feuilles de style et de transformations avec PHP. Avant de poster -> tutoriels XSL et XSLT
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/03/2007, 23h19   #1
Membre à l'essai
 
Étudiant
Inscription : septembre 2006
Messages : 51
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2006
Messages : 51
Points : 22
Points : 22
Par défaut [XSL] une variable dans un xsl ?

Bonjour,
Alors je vais essayer d'être clair mais ça me parait compliqué...

J'ai trois fichiers (un XML, un XSL pour le mettre en forme et un PHP convertir le tout en HTML) qui une fois inclus dans mon site constitueront un menu dynamique.
Afin que vous compreniez mieux, je vous met la source des 3 fichiers :

XML :

Code xml :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<tabs>
	<tab style="orange" position="7" text="A l'école">
		<link text="L'équipe à l'école" target="/contenu/ecole/equipe.php"/>
		<link text="Nos Actions" target="/contenu/ecole/actions.php"/>
	</tab>
	<tab style="blue" position="8" text="Au collège">
		<link text="L'équipe au collège" target="/contenu/college/equipe.php"/>
		<link text="Nos Actions" target="/contenu/college/actions.php"/>
	</tab>
	<tab style="green" position="9" text="L'assoc'">
		<link text="Nous contacter" target="/contenu/assoc/contact.php"/>
		<link text="Adhérer" target="/contenu/assoc/adhesion.php"/>
		<link text="Proposer votre aide" target="contenu/assoc/aide.php"/>
	</tab>
</tabs>


XSL :

Code xml :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="html" omit-xml-declaration="yes" encoding="UTF-8" />
	<xsl:template match="//tab[@position='9']/link">
		<a>
			<xsl:attribute name="href">
				<xsl:value-of select="@target"/>
			</xsl:attribute>
			<xsl:value-of select="@text"/>
		</a>
		<br/>
	</xsl:template>
</xsl:stylesheet>


PHP :

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// Nouvelle instance
$xslt = new XSLTProcessor();
// Chargement du fichier XML
$xml = new domDocument();
$xml -> load('menu.xml');
// Chargement du fichier XSL
$xsl = new domDocument();
$xsl -> load('links.xsl');
// Import de la feuille XSL
$xslt -> importStylesheet($xsl);
// Transformation et affichage du résultat
echo $xslt -> transformToXml($xml);
?>

En fait le problème c'est que le sélecteur XSL position doit être variable (position doit pouvoir prendre n'importe quelle valeur numérique et ce en fonction d'un argument passé à PHP.
Concrètement, PHP doit être en mesure de me retourner les liens correspondants à l'onglet sélectionné.

Quelqu'un voit comment on peut faire ça ?


Merci d'avance !
sbooob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2007, 23h57   #2
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
Salut !

Je te conseille de te pencher sur les paramètres

http://ca.php.net/manual/fr/function...-parameter.php
__________________
Rédacteur "éclectique" (XML, IRC, Web...)
Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
pensez à la balise [code] (bouton #) et au tag (en bas)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2007, 01h07   #3
Membre à l'essai
 
Étudiant
Inscription : septembre 2006
Messages : 51
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2006
Messages : 51
Points : 22
Points : 22
J'ai l'impression que c'est ça mais je comprends pas tout (en fait c'est l'exemple qui m'embrouille)...
C'est quoi les arguments que je dois fournir à PHP pour setparameter() ?
J'arrive pas à comprendre comment désigner ma ligne :
Code xml :
<xsl:template match="//tab[@position='9']/link">
du XSL.


En tout cas merci pour la rapidité de ta réponse
sbooob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2007, 03h18   #4
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
Pour setParameter(), c'est simple, tout est dans la doc.
Code :
$xslt->setParameter(null, 'position', 9);
Ensuite il faut déclarer le paramètre dans le fichier xsl. C'est un paramètre externe (global) et il faut donc le déclarer en top level element. Ex:

Code xml :
1
2
3
4
<xsl:param name="position"/>
<xsl:template match="//tab[@position=$position]/link">
  ...
</xsl:template>
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2007, 11h23   #5
Membre à l'essai
 
Étudiant
Inscription : septembre 2006
Messages : 51
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2006
Messages : 51
Points : 22
Points : 22
C'est la déclaration dans le XSL qui me manquait !

Je pense que j'ai compris.

Merci beaucoup
sbooob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2007, 12h14   #6
Membre à l'essai
 
Étudiant
Inscription : septembre 2006
Messages : 51
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2006
Messages : 51
Points : 22
Points : 22
Finalement ça marche pas...
Je crois que c'est le $ dans le XSL qui perturbe PHP parce qu'il me renvoie ça :

Citation:
Warning: XSLTProcessor::importStylesheet() [function.XSLTProcessor-importStylesheet]: Undefined variable in C:\Test\Engine\links.php on line 11

Warning: XSLTProcessor::importStylesheet() [function.XSLTProcessor-importStylesheet]: compilation error: file file:///C%3A/Test/Engine/links.xsl line 6 element template in C:\Test\Engine\links.php on line 11

Warning: XSLTProcessor::importStylesheet() [function.XSLTProcessor-importStylesheet]: Failed to compile predicate in C:\Test\Engine\links.php on line 11

Warning: XSLTProcessor::transformToXml() [function.XSLTProcessor-transformToXml]: No stylesheet associated to this object in C:\Test\Engine\links.php on line 14
Et à la ligne 11 j'ai :

Code :
$xslt -> importStylesheet($xsl);
sbooob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2007, 16h56   #7
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
Je suis surpris que ça ne fonctionne pas. Le processeur ne semble pas accepter des variables dans les predicats 'top level' de template

Solution alternative:

Code XML :
1
2
3
4
5
6
7
8
9
 
<xsl:param name="position" />
 
<xsl:template match="/tabs">
  <xsl:for-each select="tab[@position = $position]/link"> 
    <a href='{@target}'><xsl:value-of select="@text"/></a>
    <br/>
  </xsl:for-each> 
</xsl:template>
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2007, 17h57   #8
Membre à l'essai
 
Étudiant
Inscription : septembre 2006
Messages : 51
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2006
Messages : 51
Points : 22
Points : 22
Finalement, j'ai trouvé tout seul : le @position ne doit pas se trouver dans le match du template, il faut créer un for-each et le mettre dans le select.


Merci à tous !
sbooob est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h54.


 
 
 
 
Partenaires

Hébergement Web