Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels DOM
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 03/03/2011, 11h52   #1
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
Par défaut Résultat Xpath sous forme de tableau

Bonjour, dur dur dur de se mettre à niveau!

J'ai un document Xml que j'interroge avec php et la "méthode" xpath.
Mon doc XML:
Code :
1
2
3
4
5
6
<REC>
<FLD NAME="Nom du jeu">Elixir</FLD>
<FLD NAME="Ref">0871</FLD>
<FLD NAME="Editeur">Asmodée</FLD>
<FLD NAME="Rubrique 6">Ton jeu est en cours de livraison, réception dans 2 jours!</FLD>
		</REC>
Je récupère toutes les valeurs de la balise ainsi:
Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
	$dom = new DOMDocument();
	$dom->load('xml/expor.xml');
	$xpath = new DOMXPath($dom);
        $result = $xpath->query('//FLD[@NAME="Ref"]') ;
 
        foreach ( $result as $child ) {
	    echo $child->tagName, ' = ',  $child->nodeValue, '<br>' ;
        }
 
?>
Je bloque pour mettre un
Code :
if($result='0871'){...}
$result est un objet, normal que ça ne marche pas!
Il faut donc transcrire le résultat de la requête xpath sous la forme d'un tableau.
Mais voilà, je n'y arrive pas! La consultation des sujets du forum et de la FAQ ne m'en apprend pas plus donc je m'en remets à vous, encore une fois lol!
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 15h22   #2
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
ThomasR aborde le concept dans une réponse à ce sujet: http://www.developpez.net/forums/d10...tion-attribut/

Code :
1
2
3
4
5
6
$caracteristiques = array(); // info => valeur
$caracteristiques_entries = $xpath->query('//table[@class="description" and position() = 1]/tr');
 
foreach($caracteristiques_entries as $entry){
    $caracteristiques[$entry->childNodes->item(1)->nodeValue] = $entry->childNodes->item(3)->nodeValue;
}
mais je ne parviens pas à le réutiliser...
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 14h06   #3
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
	$test="0871";
	$dom = new DOMDocument();
	$dom->load('xml/expor.xml');
	$xpath = new DOMXPath($dom);
 
 
$result = $xpath->query('//FLD[@NAME="Ref"]') ;
$caracteristiques = array();
$i=1;
foreach ( $result as $child ) { //Pour chaque valeur de Référence,
 
$caracteristiques[$i] = $child->nodeValue; //caracteristiques[i] prend la ième valeur de Référence
if ($caracteristiques[$i]==$test){	//Si caracteristique[i]= variable $test :
echo $caracteristiques[$i];  //on affiche la Référence et
exit(); //fin du traitement
}
$i=$i+1;//sinon incrémentation et la boucle continue
}
 
echo "Référence invalide"; //Pas de Référence correspondant à la valeur de la variable $test
 
?>
Ce code fonctionne mais ne ramène que le nom de la référence que je cherche. J'ai besoin des autres balises Name.
Le Xpath doit aller un cran plus haut (facile) mais j'ai toujours un problème dans la restitution du résultat: comment construire un tableau multidimensionnel à 4 colonnes qui récupère les nodevalues?
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 11h07   #4
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
Sans réponse de votre part, et bien, disons le, je me pose des questions.
Je reste bloqué sur la récupération des nodevalues dans un tableau multi dimensionnel...

La méthode que j'emploie est-elle mauvaise? Je ferai mieux de passer par un import xml vers une base mysql puis de faire tranquillement l'extraction avec php?

Merci.
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 11h27   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Hello

S'il s'agit de récupérer des nodes pour les transformer et les afficher en HTML, il vaut mieux passer par une transformation XSLT, c'est plus rapide et plus souple:
http://php.net/manual/en/class.xsltprocessor.php
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 11h37   #6
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
Ok ça semble être l'outil approprié. Y a plus qu'à!

Merci beaucoup!
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 12h04   #7
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
Si je comprends bien, avec beaucoup de chance
le fichier xsl est le schéma du fichier xml.

On interroge (car xsl est aussi un langage) avec la fonction value of select= xpath

What else?

Non, un peu plus sérieusement... c'est plutôt balèse pour un non-informatico-addicte ça non?
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 12h44   #8
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
C'est vrai que c'est pas super simple à comprendre au départ.
Pour commencer, XSLT n'est pas un langage, c'est du XML, il n'y a donc pas de notion de fonction à proprement parler. Ce n'est pas non plus le schéma de ton XML, ça c'est la DTD (Document Type Defintion) dont l'objet est de décrire comment un document XML doit être formé dans un cas bien spécifique (XHTML par exemple dispose d'une DTD disponible sur le site du W3C).

XSLT nous sert donc à transformer notre XML dans un autre XML, dans ton cas, transformer un flux XML en XHTML.

Je pense qu'un bon point de départ pour te faire les dents sur cette techno est le tuto de w3school: http://www.w3schools.com/xsl/
Si tu as des soucis pour comprendre, le forum est là pour ça
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h16   #9
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
Re bonjour forum!

C'est pas faute de pas chercher mais là...je bloque encore!

Avec ce code (différent de celui que tu me conseillas), j'obtiens la liste de tous mes jeux : "Elixir, 0371, Asmodée", "Jungle Speed, 0372, Asmodée". Resterait donc plus qu'à dire sélectionne moi ce jeu à partir d'une variable $_POST combinée à un xpath?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" ?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="REC">
		<html>
		<body>
		<xsl:apply-templates select="FLD"/>
		</body>
		</html>
	</xsl:template>
	<xsl:template match="FLD">
		<p>
		<xsl:value-of select="@Name"/> - 
		<xsl:value-of select="."/> 
		</p>
	</xsl:template
</xsl:stylesheet>
Avec le code du lien précédent, je ne récupère pas les informations des jeux mais le nom des balises Name : "Nom du jeu, Editeur, ..."
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" ?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
<xsl:template match="/">
	  <html>
	  <body>
	  <h2>Les commandes</h2>
		<table border="1">
		  <tr bgcolor="#9acd32">
			<th>Titre1</th>
			<th>Titre2</th>
			<th>Titre3</th>
			<th>Titre4</th>
			<th>Titre5</th>
			<th>Titre6</th>
		  </tr>
		  <xsl:for-each select="catal/REC/FLD">
				<tr>
					<td>
					<xsl:value-of select="@NAME"/>
					</td>
				</tr>
 
		  </xsl:for-each>
		</table>
	  </body>
	  </html>
	</xsl:template>
 
</xsl:stylesheet>
Je peux difficilement creuser, c'est comme si j'étais pris dans une toile d'araignée (ou une balise xml!) de laquelle je ne m'extirpe pas!
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 16h47   #10
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Ce que tu dois faire:

1 - Pour le listing

On dispose d'une liste de jeux sous forme d'arbre XML. On va simplement appliquer une XSLT pour le transformer en XHMLT.

2 - Pour la recherche

L'utilisateur veut voir les détails d'un jeu. On va rechercher dans l'arbre les nodes correspondants à sa requête avec XPath et on va mettre ces nodes dans un nouveau document XML sur lequel on va appliquer notre XSLT pour le transformer en XHTML.

Voici ce à quoi ça peut ressembler:
1 - Listing
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
<?php
 
$xml_str = <<< XML
<?xml version="1.0" ?>
<games>
	<game id="1">
		<name>Les chevaliers de baphomet</name>
		<summary>Un jeu vraiment chiant...</summary>
		<price>20</price>
	</game>
	<game id="2">
		<name>left4dead 2</name>
		<summary>More Zombies, more fun !</summary>
		<price>45</price>
	</game>
	<game id="3">
		<name>Kirby</name>
		<summary>On dirait un pokemon ce truc</summary>
		<price>10</price>
	</game>
</games>
XML;
 
$xslt_str = <<< XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="/">
		<html>
			<head>
				<title>Ma liste de jeux</title>
			</head>
			<body>
				<xsl:apply-templates />
			</body>
		</html>
	</xsl:template>
	<xsl:template match="game">
		<div id="@id">
			<h2><xsl:value-of select="name" /></h2>
			<p><xsl:value-of select="summary" /></p>
		</div>
	</xsl:template>
</xsl:stylesheet>
XSLT;
 
$dom = new DOMDocument;
$dom->loadXML($xml_str);
 
$xslt_xml = new DOMDocument;
$xslt_xml->loadXML($xslt_str);
 
$xslt = new XSLTProcessor;
$xslt->importStylesheet($xslt_xml);
 
echo $xslt->transformToXML($dom);
Et voici comment tu pourrais faire la recherche:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
$dom = new DOMDocument;
$dom->loadXML($xml_str);
 
if (isset($_REQUEST['game'])) {
	$out = new DOMDocument;
	$games = $out->appendChild(new DOMElement('games'));
 
	$xpath = new DOMXPath($dom);	
	$query = "game/name[. = '{$_REQUEST['game']}']/..";
	$nodes = $xpath->query($query);
 
	foreach ($nodes as $node) {
		$node = $out->importNode($node->cloneNode(true), true);
		$games->appendChild($node);
	}
 
	$dom = $out;
}
 
$xslt_xml = new DOMDocument;
$xslt_xml->loadXML($xslt_str);
 
$xslt = new XSLTProcessor;
$xslt->importStylesheet($xslt_xml);
 
echo $xslt->transformToXML($dom);
Dans le cadre de la recherche, on détermine tout d'abord si l'utilisateur à bien saisi le paramètre 'game', si c'est le cas, on crée un nouveau DOMDocument ($out). On génère une requête XPath qui va nous servir à trouver l'item recherché (les nodes 'game' ayant un enfant 'name' dont la valeur vaut '$_REQUEST['game']' - on prends le parent du node 'name' trouvé c-a-d 'game' avec '/..').
On clone ces nodes et on les importe dans le nouveau document ($out) avant de remplacer le $dom à afficher par ce dernier. Le reste est identique.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 09h22   #11
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
Salut!

En testant de manière classique (enfin comme je connais) ton code (un fichier xml et un xsl) l'affichage fonctionne.

En revanche en regroupant les codes dans un fichier php, l'erreur souvent relatée sur le web apparaît:
Fatal error: Class 'XSLTProcessor' not found in ...

Alors bien sûr on n'abandonne pas et on cherche, on cherche...
Dans Wamp, je dé-commente dans le fichier php.ini la ligne extension=php_xsl.dll et redémarre serveur et machine mais pas de changement...

Et je ne trouve rien de plus sur le web.
Je sollicite (pourtant j'aurai voulu m'en dépatouiller seul!!!) encore un efois ta précieuse aide...
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 09h45   #12
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Dans wamp: clic gauche sur l'icone > PHP > Extension > php_xsl

__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 09h47   #13
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Pendant que je suis là, voici un code permettant d'afficher un descriptif détaillé lors qu'on séléctionne un jeu:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 
<?php
 
$xml_str = <<< XML
<?xml version="1.0" ?>
<games>
	<game id="1">
		<name>Les chevaliers de baphomet</name>
		<summary>Un jeu vraiment chiant...</summary>
		<description>Lorem ipsum sit bla bla bla...</description>
		<price>20</price>
	</game>
	<game id="2">
		<name>left4dead 2</name>
		<summary>More Zombies, more fun !</summary>
		<description>Lorem ipsum sit bla bla bla...</description>
		<price>45</price>
	</game>
	<game id="3">
		<name>Kirby</name>
		<summary>On dirait un pokemon ce truc</summary>
		<description>Lorem ipsum sit bla bla bla...</description>
		<price>10</price>
	</game>
</games>
XML;
 
$xslt_str = <<< XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="/">
		<html>
			<head>
				<title>Ma liste de jeux</title>
			</head>
			<body>
				<xsl:apply-templates />
			</body>
		</html>
	</xsl:template>
	<xsl:template match="game[@detailed]">
		<div id="{@id}">
			<h2><xsl:value-of select="name" /></h2>
			<h3><xsl:value-of select="summary" /></h3>
			<p><xsl:value-of select="description" /></p>
			<span>Prix: <xsl:value-of select="price" /></span>
		</div>
	</xsl:template>
	<xsl:template match="game">
		<div id="{@id}">
			<h2><xsl:value-of select="name" /></h2>
			<p><xsl:value-of select="summary" /></p>
		</div>
	</xsl:template>
</xsl:stylesheet>
XSLT;
 
$dom = new DOMDocument;
$dom->loadXML($xml_str);
 
if (isset($_REQUEST['game'])) {
	$out = new DOMDocument;
	$games = $out->appendChild(new DOMElement('games'));
 
	$xpath = new DOMXPath($dom);	
	$query = "game/name[. = '{$_REQUEST['game']}']/..";
	$nodes = $xpath->query($query);
 
	foreach ($nodes as $node) {
		$node = $out->importNode($node->cloneNode(true), true);
		$games->appendChild($node)->setAttribute('detailed', 'detailed');
	}
 
	$dom = $out;
}
 
$xslt_xml = new DOMDocument;
$xslt_xml->loadXML($xslt_str);
 
$xslt = new XSLTProcessor;
$xslt->importStylesheet($xslt_xml);
 
echo $xslt->transformToXML($dom);
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 10h52   #14
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
Génial!
J'assimile, j'adapte et je vote compte triple pour benji!
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 16h42   #15
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
En adaptant ainsi:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
 
$xml_str = <<< XML
<?xml version="1.0" ?>
<produits>
		<REC>
			<FLD NAME="Nom-du-jeu">Elixir</FLD>
			<FLD NAME="Ref">0871</FLD>
			<FLD NAME="Editeur">Asmodee</FLD>
			<FLD NAME="Rubrique6">Ton jeu est en cours de livraison, reception dans 2 jours!</FLD>
		</REC>
		<REC>
			<FLD NAME="Nom-du-jeu">Jungle speed</FLD>
			<FLD NAME="Ref">0872</FLD>
			<FLD NAME="Editeur">Asmodee</FLD>
			<FLD NAME="Rubrique6">Je n'ai plus ton jeu en stock, reapprovisionnement le mois prochain!</FLD>
		</REC>	
</produits>
XML;
 
$xslt_str = <<< XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="/">
		<html>
			<head>
				<title>Suivi de commmande</title>
			</head>
			<body>
				<xsl:apply-templates />
			</body>
		</html>
	</xsl:template>
	<xsl:template match="REC/FLD[@detailed]">
 
			<!--<h2><xsl:value-of select="@NAME"/></h2>
			<h3><xsl:value-of select="@NAME='Nom-du-jeu'" /></h3>-->
 
	</xsl:template>
<!--	<xsl:template match="REC">
 
			<h2><xsl:value-of select="FLD" /></h2>
			<p><xsl:value-of select="@NAME='Rubrique6'" /></p>
 
	</xsl:template>
-->
</xsl:stylesheet>
XSLT;
 
$dom = new DOMDocument;
$dom->loadXML($xml_str);
 
if (isset($_POST['RECHERCHE'])) {
	$out = new DOMDocument;
	$games = $out->appendChild(new DOMElement('produits'));
 
	$xpath = new DOMXPath($dom);	
	$query = "REC/FLD[@NAME='Ref'][. = '{$_POST['RECHERCHE']}']/..";
	$nodes = $xpath->query($query);
 
	foreach ($nodes as $node) {
		$node = $out->importNode($node->cloneNode(true), true);
		$games->appendChild($node)->setAttribute('detailed', 'detailed');
	}
 
	$dom = $out;
}
 
$xslt_xml = new DOMDocument;
$xslt_xml->loadXML($xslt_str);
 
$xslt = new XSLTProcessor;
$xslt->importStylesheet($xslt_xml);
 
echo $xslt->transformToXML($dom);
?>
Avec la Ref=0872, j'obtiens par exemple ce résultat :
"Jungle speed 0872 Asmodee Je n'ai plus ton jeu en stock, reapprovisionnement le mois prochain! "
Et c'est pas mal!

Le hic, c'est la mise en forme xsl:le noeud FLD possède plusieurs attributs NAME et je ne vois pas comment xsl peut les distinguer. Pire, chaque nom d'attribut possède des espaces : NAME= "Nom du jeu"

Depuis le début, le problème vient de cette structure xmlique :
Code :
1
2
3
4
5
6
 
<REC>
<FLD NAME= "Nom du jeu"> Jungle</FLD>
<FLD NAME="Référence jeu">0872</FLD>
...
</REC>
Faut-il modifier la structure de ce xml? Ou xsl peut-il dissocier les différents attributs NAME en fonction de leur nom? Ou les deux ? Merci par avance!
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 17h52   #16
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Peut être en changeant la XSLT de cette façon:
Code :
1
2
3
4
5
 
<xsl:template match="REC[@detailed]">
  <h1><xsl:value-of select="FLD[@NAME='Nom-du-jeu']" /></h1>
  ....
</xsl:template>
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 10h50   #17
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
Super, c'est exactement ça!

Dernière mini-petite chose : l'encodage...

J'ai rajouté
Code :
<?xml version="1.0" encoding="ISO-8859-1"?>
pour la gestion des accents dans le fichier xsl. C'est ok.

Par contre, l'extraction ne fonctionne pas pour php, notamment cette ligne:
Code :
$query = "REC/FLD[@NAME='Réf'][. = '{$_POST['RECHERCHE']}']/..";
Comment dois-je gérer ça? Dois-je utiliser utf8_encode?
J'ai testé :
Code :
$query = "REC/FLD[@NAME='utf8_encode(Réf)'][. = '{$_POST['RECHERCHE']}']/..";
mais pas de résultat...
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 11h00   #18
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
En encodant également le document :
Code :
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
ça ne fonctionne pas...
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 11h05   #19
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Te casse pas la tête et mets de l'utf8 partout.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 11h11   #20
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 129
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 129
Points : 36
Points : 36
ça ne change rien...

Code :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
et
Code :
1
2
$var=utf8_encode("Réf");
	$query = "REC/FLD[@NAME=$var][. = '{$_POST['RECHERCHE']}']/..";
me retourne une page vide...
granchef 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 15h25.


 
 
 
 
Partenaires

Hébergement Web