Bonsoir à tous,

J'essaie de crééer une requête pour m'afficher tous les produits d'un fichier XML par rapport à un critére :

Mon fichier XML est le suivant avec plus de produits :
<?xml version="1.0" encoding="UTF-8" ?> 

- <catalogue id="523">

  <progname>Test de catalogue</progname> 

- <store>

  <name>Catalogue</name> 

- <products>

- <product>

- <product_id>

  <ean /> 

  <store>963932</store> 

  <manufacturer /> 

  </product_id>

  <trademark /> 

  <title>Collier</title> 

  <desc>Ras du cou </desc> 

  <full_desc /> 

- <url>

- <![CDATA[   http://www.site.com
 

  ]]> 

  </url>

  <other /> 

- <product_images>

  <image type="default">http://www.site.com/image.jpg</image> 

  <image type="small" /> 

  <image type="medium" /> 

  <image type="large" /> 

  </product_images>

  <price currency="EUR">855</price> 

- <tax>

  <name /> 

  <price currency="EUR" /> 

  </tax>

- <shipping>

  <delivery>port gratuit pour les achats dès EUR 75.00</delivery> 

  <price currency="EUR">5.95</price> 

  </shipping>

- <category>

- <merchant>

  <name>Collection Fashion</name> 

  <id /> 

  </merchant>

  </category>

  </product>

- <product>

- <product_id>

  <ean /> 

  <store>963931</store> 

  <manufacturer /> 

  </product_id>

  <trademark /> 

  <title>Ace</title> 

  <desc>Grand coeur chaîne en argent</desc> 

  <full_desc /> 

- <url>

- <![CDATA[   http://www.site.com
 

  ]]> 

  </url>

  <other /> 

- <product_images>

  <image type="default">http://www.site.com/image.jpg</image> 

  <image type="small" /> 

  <image type="medium" /> 

  <image type="large" /> 

  </product_images>

  <price currency="EUR">1150</price> 

- <tax>

  <name /> 

  <price currency="EUR" /> 

  </tax>

- <shipping>

  <delivery>port gratuit pour les achats dès EUR 75.00</delivery> 

  <price currency="EUR">5.95</price> 

  </shipping>

- <category>

- <merchant>

  <name>Collection Fashion</name> 

  <id /> 

  </merchant>

  </category>

  </product>

- <product>

- <product_id>

  <ean /> 

  <store>963930</store> 

  <manufacturer /> 

  </product_id>

  <trademark /> 

  <title>Ace of </title> 

  <desc>Grand coeur </desc> 

  <full_desc /> 

- <url>

- <![CDATA[   http://www.site.com
 

  ]]> 

  </url>

  <other /> 

- <product_images>

  <image type="default">http://www.site.com/image.jpg</image> 

  <image type="small" /> 

  <image type="medium" /> 

  <image type="large" /> 

  </product_images>

  <price currency="EUR">1150</price> 

- <tax>

  <name /> 

  <price currency="EUR" /> 

  </tax>

- <shipping>

  <delivery>port gratuit pour les achats dès EUR 75.00</delivery> 

  <price currency="EUR">5.95</price> 

  </shipping>

- <category>

- <merchant>

  <name>Collection couture</name> 

  <id /> 

  </merchant>

  </category>

  </product>

- <product>

- <product_id>

  <ean /> 

  <store>963929</store> 

  <manufacturer /> 

  </product_id>

  <trademark /> 

  <title>Downtown</title> 

  <desc>Bracelet en cuir.</desc> 

  <full_desc /> 

- <url>

- <![CDATA[   http://www.site.com
 

  ]]> 

  </url>

  <other /> 

- <product_images>

  <image type="default">http://www.site.com/image.jpg</image> 

  <image type="small" /> 

  <image type="medium" /> 

  <image type="large" /> 

  </product_images>

  <price currency="EUR">265</price> 

- <tax>

  <name /> 

  <price currency="EUR" /> 

  </tax>

- <shipping>

  <delivery>port gratuit pour les achats dès EUR 75.00</delivery> 

  <price currency="EUR">5.95</price> 

  </shipping>

- <category>

- <merchant>

  <name>Collection Fashion</name> 

  <id /> 

  </merchant>

  </category>

  </product>

</products>

</store>

</catalogue>


J'arrive à liste tous les produits mais je souhaiterais lister les produits par rapport à leurs prix par exemple ou leurs categories. J'ai donc créé une boucle qui liste mes produits de cette facon :



for($i=$photoDeDepart;$i<$photoDeDepart+10;$i++)
{
    $numeroPhoto = $i;

echo '<br />
			
<table width="100%" cellspacing="2" cellpadding="2" summary="';
 echo utf8_decode($photos->getElementsByTagName('title')->item($numeroPhoto)->firstChild->data);
echo '" style=border-bottom:1px solid #000;>';
echo '<tr>
    <td width="150" style="height:120px;">';
 $image = $photos->getElementsByTagName('product_images')->item($numeroPhoto);
 
foreach($image as $image)
echo "Voir";
	echo "<a href='";
	echo $photos->getElementsByTagName('url')->item($numeroPhoto)->firstChild->data;
	echo "' title='";
	 echo $photos->getElementsByTagName('title')->item($numeroPhoto)->firstChild->data;
	 echo "' >";
	echo "<img class='image-produit' src='";
  echo $image->firstChild->nodeValue;
	 echo "' alt='";
	 echo $photos->getElementsByTagName('title')->item($numeroPhoto)->firstChild->data;
	 echo "' /></a>";

	   echo '<p><a href="';
	    echo $photos->getElementsByTagName('url')->item($numeroPhoto)->firstChild->data;
	   echo '" title="';
	    echo $photos->getElementsByTagName('title')->item($numeroPhoto)->firstChild->data;
	   echo'"></p> ';

}



Comment lister par rapport à un critére de sélection comme le prix ?

Merci de votre aide Smiley ravi
Salut,

Si tu veux faire des requêtes sur un fichier xml, il existe le langage xgql. Cependant je ne peux pas t'en dire plus sur ce langage que je ne connait que de nom. Mais il faudrait que tu fasses des recherches surement longues avant de trouver un bon tuto digne de ce nom.

Sinon l'autre méthode envisageable est de stocker les prix et la position du nœud parents dans un tableau puis d'effectuer un tri sur le tableau. Ensuite grâce aux positions stockées tu pourras afficher les produits triés.
A mon avis stockers les pris dans un tableau avec un fichier de plus de 20Mo voir beaucoup plus risque d'être trop long.

Et sinon en faisant un test avec un if ($prix == 9.90) cela doit fonctionner le probleme c'est que je parcourt tous le catalogue à chauqe fois.
Je confirme faire le tri en utilisant un tableau c'est très lourd surtout pour un fichier de 20Mo.

La solution que tu proposes doit fonctionner effectivement, et pour savoir si elle est acceptable il faut regarder le temps de chargement de la page.
Modérateur
Re,

Je laisse un exemple... Smiley cligne

code php
<?php

final class Page {

	final private function parse($tab)
	{
		if(is_array($tab) && !empty($tab['xml']) && !empty($tab['xsl']))
		{
			$DomXml = DOMDocument::load($tab['xml'])
			or die('Le fichier xml est indisponible ou comporte des erreurs ! [cligne]');

			$DomXsl = DOMDocument::load($tab['xsl'])
			or die('Le fichier xsl est indisponible ou comporte des erreurs ! [cligne]');

			$process = new XSLTProcessor;
			$process->importStyleSheet($DomXsl);

			foreach($tab as $param => $value)
				if($param === 'xml' || $param === 'xsl')
					continue;
				else
					$process->setParameter("", $param, htmlspecialchars($value));

			return print $process->transformToXML($DomXml);
		}
	}

	final public function __construct($xml, $xsl, $tri)
	{
		header('Content-type: text/html; charset=utf-8');

		$tab = array(
			'xml' => $xml,
			'xsl' => $xsl,
			'tri' => $tri
		);

		return Page::parse($tab);
	}
}

$xml = 'tab.xml';
$xsl = 'tab.xsl';
$values = array('auteur', 'titre', 'annee', 'editeur', 'genre', 'isbn');
$tri = !empty($_GET['tri']) && in_array($_GET['tri'], $values, true) ? $_GET['tri']: 'auteur';

new Page($xml, $xsl, $tri);

?>

code xml
<?xml version="1.0" encoding="utf-8" ?>

<livres>
	<livre>
		<auteur>Steven Holner</auteur>
		<titre>XSLT par la pratique</titre>
		<annee>2002</annee>
		<editeur>Eyrolles</editeur>
		<genre>Programmation</genre>
		<ISBN>2-212-11040-5</ISBN>
	</livre>
	<livre>
		<auteur>Kate Mosse</auteur>
		<titre>Labyrinthe</titre>
		<annee>2006</annee>
		<editeur>JC Lattès</editeur>
		<genre>Roman</genre>
		<ISBN>2-7096-2583-0</ISBN>
	</livre>
	<livre>
		<auteur>Jack Vance</auteur>
		<titre>Emphyrio & autres aventures</titre>
		<annee>2004</annee>
		<editeur>DENOEL</editeur>
		<genre>Science Fiction</genre>
		<ISBN>2.207.25429.1</ISBN>
	</livre>
</livres>

code xslt
<?xml version="1.0" encoding="utf-8" ?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

	<xsl:output
		method="xml"
		version="1.0"
		encoding="utf-8"
		omit-xml-declaration="yes"
		doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
		doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
		indent="yes"/>

	<xsl:param name="tri"/>

	<xsl:template match="livres">
		<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
			<head>
				<meta http-equiv="content-type" content="text/html; charset=utf-8" />
				<title>Exemple de triage d'un tableau</title>
			</head>
			<body>
				<table summary="les livres de ma bibliothèque">
					<tr>
						<th><a href="index.php?tri=auteur">Auteur</a></th>
						<th><a href="index.php?tri=titre">Titre</a></th>
						<th><a href="index.php?tri=annee">Année</a></th>
						<th><a href="index.php?tri=editeur">Editeur</a></th>
						<th><a href="index.php?tri=genre">Genre</a></th>
						<th><a href="index.php?tri=isbn">ISBN</a></th>
					</tr>

					<xsl:apply-templates select="livre">
						<xsl:sort select="*[name()=$tri]" />
					</xsl:apply-templates>
				</table>
			</body>
		</html>
	</xsl:template>

	<xsl:template match="livre">
		<tr xmlns="http://www.w3.org/1999/xhtml">
			<td><xsl:value-of select="auteur"/></td>
			<td><xsl:value-of select="titre"/></td>
			<td><xsl:value-of select="annee"/></td>
			<td><xsl:value-of select="editeur"/></td>
			<td><xsl:value-of select="genre"/></td>
			<td><xsl:value-of select="ISBN"/></td>
		</tr>
	</xsl:template>

</xsl:stylesheet>