Bonjour à tous,

je rencontre un problème avec ce code (Xslt) :
<xsl:template match="/">


<!-- $orderbyascdesc treatment -->
<xsl:choose>
	<xsl:when test="$orderbyascdesc = 'asc'">
		<xsl:param name="order">ascending</xsl:param>
	</xsl:when>
	<xsl:when test="$orderbyascdesc = 'desc'">
		<xsl:param name="order">descending</xsl:param>
	</xsl:when>
	<xsl:otherwise>
		<xsl:param name="order">ascending</xsl:param>
	</xsl:otherwise>
</xsl:choose>
<!-- end of $orderbyascdesc treatment -->

<!-- param fonctionne ici -->

<table>
<tr><th>Mot</th><th>Traduction</th><th>Type</th><th>Langue</th></tr>
	<xsl:apply-templates select="word">
		<xsl:sort select="@word" datat-type="text" order="{$order}"/>
	</xsl:apply-templates>
</table>
</xsl:template>


En fait le xsl:choose n'a pas l'air d'être exécuté puisque je reçoit les Warning suivants (je traite mes fichiers avec php5) :
a écrit :
Warning: runtime error: file file:///C%3A/www/langdb/xsl_stylesheets/search.xsl element apply-templates in C:\www\langdb\search.php5 on line 152

Warning: unregistered variable order in C:\www\langdb\search.php5 on line 152

Warning: xmlXPathCompiledEval: evaluation failed in C:\www\langdb\search.php5 on line 152


Ce qui est étrange, c'est que quand je mets un <xsl:param name="order">ascending</xsl:param> comme indiqué dans le code ci-dessus, tout fonctionne parfaitement ... Smiley rolleyes

Donc si quelqu'un a une idée ... je suis preneur Smiley langue

Amicalement,

SirWam
Salut !

Deux remarque :

1 - A quoi sert la structure <xsl:choose> ? Pourquoi ne pas passer directement le contenu de $order ?

2 - Il ne faut pas mettre de d'accolades autour des variables :
 <xsl:apply-templates select="word">
<xsl:sort select="@word" datat-type="text" order="{$order}"/>

Et si je comprend bien, tu a une balise WORD avec un attribut word ?

Smiley smile
Modifié par Jep (03 Jun 2005 - 12:58)
1 - c'est juste un test en fait

2 - Je sais mais sans j'ai cette erreur :
a écrit :
Warning: compilation error: file file:///C%3A/www/langdb/xsl_stylesheets/search.xsl element sort in C:\www\langdb\search.php5 on line 139

Warning: xsltSortComp: invalid value $order for order in C:\www\langdb\search.php5 on line 139


Bon je vais utiliser directement la valeur issue de php.

Merci quand même.

a+
En découle un autre problème ... : je n'arrive pas à utiliser mes variables dans le select de l'élément sort.

Voici ce qui ne fonctionne pas :
<xsl:apply-templates select="word">
		<xsl:sort select="$orderby" datat-type="text" order="{$orderbyascdesc}"/>
		<xsl:sort select="$orderby2" datat-type="text" order="{$orderbyascdesc2}"/>
	</xsl:apply-templates>

Mes orderbys ont pour valeurs, au choix : @word, @type, @lang.
Lorsque je remplace dans le code ci-dessus les variables par ces trois valeurs, tout fonctionne.
Cette fois si je mets les accolades, j'obtiens cette erreur :
a écrit :
Warning: Invalid expression in C:\www\langdb\search.php5 on line 139

Warning: compilation error: file file:///C%3A/www/langdb/xsl_stylesheets/search.xsl element sort in C:\www\langdb\search.php5 on line 139

Warning: xsltSortComp: could not compile select expression '{$orderby}' in C:\www\langdb\search.php5 on line 139

Warning: XSLTProcessor::transformToXml() [function.transformToXml]: No stylesheet associated to this object in C:\www\langdb\search.php5 on line 150


En fait j'ai l'impression que le processeur traite ça comme un string et non comme un axe.

Si quelqu'un a des idées ...

Amicalement,

SirWam

EDIT : problème résolu grâce à cette adresse -> http://www.xslt.com/html/xsl-list/2002-02/msg00708.html

Il fallait mettre :
		<xsl:sort select="@*[name()=$orderby]" datat-type="text" order="{$orderbyascdesc}"/>
		<xsl:sort select="@*[name()=$orderby2]" datat-type="text" order="{$orderbyascdesc2}"/>


Cya all
Modifié par SirWam (03 Jun 2005 - 14:27)
Tu as déjà résolu ton problème, c'est l'essentiel, mais je te donnes tout de même la cause du premier message d'erreur
a écrit :
Warning: unregistered variable order

En fait en XSLT, le fonctionnement des variables est très différent de ce que l'on connait dans un language de programmation classique. En particulier il faut savoir que leur validité (ou leur existence si tu préfères) est limitée aux éléments frères de la variable. Ainsi dans ton exemple de code, ton paramètre $order n'existe qu'à l'intérieur du noeud <xsl:when>. Il n'existe plus au moment ou tu l'appelles dans ton code.

Il faut donc complètement inverser la façon de définir la variable, voici un exemple :
 <xsl:param name="order">
<xsl:choose>
<xsl:when test="$orderbyascdesc = 'desc'">
  ...
</xsl:when>
<xsl:otherwise>
  ...
</xsl:otherwise>
</xsl:choose>
 </xsl:param>

Modifié par Xavier (05 Jun 2005 - 00:02)
Merci pour ces précisions, je crois avoir compris mais ... pourrais tu corriger l'erreur de syntaxe stp Smiley lol ?

Encore merci,

SirWam

EDIT : thx j'ai compris mon erreur
Modifié par SirWam (05 Jun 2005 - 00:08)