bonjour a tous et toutes
mon initiation a XML/XSL se trouve bloquer par un probleme de passage de parametre a la fonctions xsl:sort...
je m'explique..
le code PHP qui suit genere une combinaison xml/xsl avec le passage d'un parametre (tri)
<?php
$xsltproc = '/usr/bin/xsltproc';

$params = "--param tri \"'annee'\"";


$cmd = $xsltproc.' '.$params.' biblio.xsl liste.xml 2>&1';
exec($cmd,$array_res);
echo implode("\n",$array_res);
?>


dans mon code 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 method="xml" encoding="ISO-8859-1" indent="yes"/>



<xsl:param name="tri"/>


<xsl:template match="/">

<html>
<head>
	<title>Ma bibliotheque</title>
  	<meta content="Quatre" name="author" />
  	<link rel="stylesheet" href="biblio.css" type="text/css" />
</head>

<body>
 
<div class="entete">
	<H1>MA BIBLIOTHEQUE</H1>
</div>

<div class="menu">
	<xsl:call-template name="menu"/>

</div>

<div class="corps">
	<table border="1" width="100%">
		<tr>
			<th>Auteur</th>
			<th>Titre</th>
			<th>Année</th>
			<th>Editeur</th>
			<th>Genre</th>
			<th>ISBN</th>
		</tr>
		
		<xsl:call-template name="livre">
		<xsl:with-param name="tri" select="$tri"/>
		</xsl:call-template>
		
		</table>

</div>

</body>

</html>

</xsl:template>	

<xsl:template name="menu">
	<ul>
		<xsl:for-each select="/bibliotheque/menu/lien">
		<li>
			<a>
			<xsl:attribute name="href">
				<xsl:value-of select="url" />
			</xsl:attribute>
			<xsl:value-of select="intitule"/>
			</a>
		</li>

		</xsl:for-each>	
	</ul>	
</xsl:template>

<xsl:template name="livre">
	<xsl:value-of select="$tri"/>	
	<xsl:for-each select="/bibliotheque/livre">
	<xsl:sort select="tri" />
		<tr>
		<td>		
			<xsl:value-of select="auteur/prenom"/>
			<xsl:text> </xsl:text>
			<xsl:value-of select="auteur/nom"/>
		</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:for-each>
</xsl:template>

</xsl:stylesheet>

le parametre $tri est bien reconnu dans le template name="livre" value-of...
mais la fonction <xsl:sort select="tri"> ne fonctionne pas...

apres de nombreuses recherches infructueuses sur differents forums et autres documentations, je n'ai pas trouver la solution...

si quelqu'un a une idée? une piste? je suis preneur..

merci d'avance.

Quatre
Modérateur
Salut,

Je ne suis pas sûr d'avoir bien compris ta demande mais si la question est qu'en fonction de la valeur du paramètre tri, tu puisses changer le mode de triage du tableau, tu peux créer une variable supplémentaire et effectuer le tri en fonction de la valeur de la variable...

Je te donne un exemple de code qui n'utilise pas xsl:sort mais qui reprend ce principe :
	<xsl:param name="ident"/>
	<xsl:param name="coord"/>
	<xsl:param name="situ"/>
	<xsl:param name="form"/>

	<xsl:template match="group">

		<xsl:variable name="dbFieldGroup">
			<xsl:if test="@id = 'ident'"><xsl:value-of select="$ident"/></xsl:if>
			<xsl:if test="@id = 'coord'"><xsl:value-of select="$coord"/></xsl:if>
			<xsl:if test="@id = 'situ'"><xsl:value-of select="$situ"/></xsl:if>
			<xsl:if test="@id = 'form'"><xsl:value-of select="$form"/></xsl:if>
		</xsl:variable>

		<fieldset xmlns="http://www.w3.org/1999/xhtml">
			<legend><xsl:value-of select="$dbFieldGroup"/></legend>

			<xsl:apply-templates select="ent"/>
			<xsl:apply-templates select="inmixt"/>
			<xsl:apply-templates select="ingroup"/>

		</fieldset>

	</xsl:template>
bonjour
tu a tout compris Koala..
le parametre "tri" est en fait le nom d'un element de mon fichier XML et doit donc me permettre de trier mon résultat..

comme tu la suggeré ,j'ai recreer une variable à partir de mon parametre mais cela ne change rien...
voila comment j'ai procédé :

<xsl:template name="livre">
	
	<xsl:variable name="var">
	<xsl:if test="contains($tri,'annee')">'genre'</xsl:if>
	</xsl:variable>
	
	<xsl:value-of select="$var"/>	
	
	<xsl:for-each select="/bibliotheque/livre">
	<xsl:sort select="$var" />
		<tr>
		<td>		
			<xsl:value-of select="auteur/prenom"/>
			<xsl:text> </xsl:text>
			<xsl:value-of select="auteur/nom"/>
		</td>

etc... 


d'autres suggestions????


Quatre
Modérateur
Ah ! oui Smiley ravi ... enfin Smiley langue

Effectivement, il y avait un problème lorsqu'on passait par un paramètre ou une variable en direct. Du coup, j'ai feinté et je suis arrivé à ceci :

Exemple :
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');
		ob_start('ob_gzhandler');

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

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

$xml = 'tab.xml';
$xsl = 'tab.xsl';
$tri = 'auteur';

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

?>


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 &#038; autres aventures</titre>
		<annee>2004</annee>
		<editeur>DENOEL</editeur>
		<genre>Science Fiction</genre>
		<ISBN>2.207.25429.1</ISBN>
	</livre>
</livres>


XSL
<?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>Auteur</th>
						<th>Titre</th>
						<th>Année</th>
						<th>Editeur</th>
						<th>Genre</th>
						<th>ISBN</th>
					</tr>

					<xsl:choose>
						<xsl:when test="$tri = 'auteur'">
							<xsl:apply-templates select="livre">
								<xsl:sort select="auteur"/>
							</xsl:apply-templates>
						</xsl:when>
						<xsl:when test="$tri = 'titre'">
							<xsl:apply-templates select="livre">
								<xsl:sort select="titre"/>
							</xsl:apply-templates>
						</xsl:when>
						<xsl:when test="$tri = 'annee'">
							<xsl:apply-templates select="livre">
								<xsl:sort select="annee"/>
							</xsl:apply-templates>
						</xsl:when>
						<xsl:when test="$tri = 'editeur'">
							<xsl:apply-templates select="livre">
								<xsl:sort select="editeur"/>
							</xsl:apply-templates>
						</xsl:when>
						<xsl:when test="$tri = 'genre'">
							<xsl:apply-templates select="livre">
								<xsl:sort select="genre"/>
							</xsl:apply-templates>
						</xsl:when>
						<xsl:otherwise>
							<xsl:apply-templates select="livre">
								<xsl:sort select="ISBN"/>
							</xsl:apply-templates>
						</xsl:otherwise>
					</xsl:choose>

				</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>


et ça marche. Smiley murf J'ai toujours adoré le côté léger du XSLT. Smiley biggol
Modifié par koala64 (17 Apr 2007 - 20:54)
merci pour ta réponse vers laquelle je m'orientais avant de trouver (enfin) la solution...
la commande sort doit ressembler a ceci :
<xsl:sort select="*[name()=$tri]" />


et comme ca cela marche dans ma configuration...

Quatre
Modifié par Quatre (17 Apr 2007 - 21:15)
Modérateur
Exact. Smiley cligne

Je viens de modifier mon code comme ceci :
<?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>Auteur</th>
						<th>Titre</th>
						<th>Année</th>
						<th>Editeur</th>
						<th>Genre</th>
						<th>ISBN</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>
et c'est nickel. Smiley smile ( faut que je bosse sur XPath donc Smiley murf )
Modifié par koala64 (17 Apr 2007 - 21:30)