Bonjour,

Le problème consiste à appliquer une sorte de "filtre" dynamique sur une liste d'éléments.
L'exemple qui suit est sans doute faux, mais donne l'idée du résultat recherché.

XML
<repas>
	<plat legumes="legumes">Tarte tomate-mozarella</plat>
	<plat chaud="chaud" viande="viande">Poulet aux quatre épices</plat>
	<plat chaud="chaud" legumes="legumes">fricassée de courgettes</plat>
	<plat fruits="fruits">Crumble aux fruits de saison</plat>
</repas>


XSLT
<xsl:template select="/">
	<h1>Liste des plats froids</h1>
	<ul>
		<xsl:for-each select="$selection">
			<li><xsl:value-of select="." /></li>
		</xsl:for-each>
	</ul>
</xsl:template>


XHTML résultant
<h1>Liste des plats froids</h1>
<ul>
	<li>Tarte tomate-mozarella</li>
	<li>Crumble aux fruits de saison</li>
</ul>


Ici, le paramètre/la variable $selection vaudrait : /repas/plat[not(@chaud) ], mais on pourrait aussi vouloir sélectionner les plats qui contiennent des légumes /repas/plat[@legumes ], etc.

Bref, comment rendre variable le paramètre select du xsl:for-each ?

Cordialement,
François
Modifié par elvex (04 Jun 2006 - 22:56)
Slt,

c'est un problème récurrent qui vient du fait qu'une chaîne contenu dans une variable n'est pas interprétée. Certains parseur ont introduit des fonctions XPath du genre evaluate($query) je crois mais ça reste non standard.

Dans ce cas on contourne en faisant :
/repas/plat[not(@*[name()=$var])]]

En traduisant en français avec "$var" valant "froid" :
tous les éléments "plat" enfant de "repas" dont aucun attribut n'a pour nom "froid".

Cependant je trouve ton XML très mal structuré. Il aurait été beaucoup plus simple de mettre des attributs chaleur fixés à "froid", "chaud", etc et type pour "légumes", "viandes", etc. C'est une erreur de conception.

a+
Les feuilles présentées le sont juste à titre d'exemple, elles ne correspondent pas du tout au projet. Smiley smile
N'y a-t-il pas un autre moyen de s'en sortir, en utilisant un appel à une "fonction" ou quelque chose comme ça ? En fait, peu importe la structure du XML.
D'ailleurs, il ne s'agit pas de réévaluer la requête Smiley confus , mais plutôt d'enregistrer le résultat de cette requête (enregistrer la liste des noeuds <plat> correspondants dans cet exemple)
Si l'on ne peut pas enregistrer le résultat d'une requête XPath dans une variable, y a-t-il un moyen pour réaliser un appel dynamique à une requête XPath ?

J'avais pensé, par exemple, à un code du genre :
<xsl:choose>
	<xsl:when test="$mode='tous'">
		<xsl:param name="selection" select="/repas/plat" />
	</xsl:when>
	<xsl:when test="$mode='froid'">
		<xsl:param name="selection" select="/repas/plat[@froid]" />
	</xsl:when>
	<xsl:when test="$mode='legume'">
		<xsl:param name="selection" select="/repas/plat[@legumes]" />
	</xsl:when>
</xsl:choose>


En bonus : quelle est la différence entre <xsl:param> et <xsl:variable> ?
Modifié par elvex (28 May 2006 - 20:45)
Salut

comme cela peut être:


<xsl:variable name="selection" select="noeud"/>


Ou passage de parametre à la feuille xslt


<xsl:param name="selection"/>
<xsl:apply-templates select="plat[@flag=$selection]" mode="plat"/>

Si affichage different:
<xsl:templates match="plat/[@flag='froid']" mode="plat">
.....
</xsl:templates>

<xsl:templates match="plat/[@flag='chaud']" mode="plat">
.....
</xsl:templates>

Si affichage identique:

<xsl:templates match="plat/@flag" mode="plat">
.....
</xsl:templates>

a écrit :

En fait, peu importe la structure du XML.


Ou la Smiley sweatdrop
Je ne suis pas d'accord avec toi.
Tu veux traiter un exemple ou le code XML est mal formé.
Difficile dans ce cas d'apprendre à ce servir de Xpath.

Xpath est trés puissant, mais ce n'est pas un language de programmation.

a écrit :

Le problème consiste à appliquer une sorte de "filtre" dynamique sur une liste d'éléments.


Et bien Xpath et XSL sont des filtres dynamique.


Exemple:

<repas id="1">
     <name lang="fr">superbon</name>
     <name lang="en">beautyfull</name>
     <plat id="entree" flag="froid">
        <name lang="fr">Tarte tomate-mozarella</name>
    </plat>
 
    <plat id="principal" flag="chaud">
      <name lang="fr">Poulet</name>
     </plat>
    <plat id="principal" flag="chaud">
     <name lang="fr">fricassée de courgettes</name>
    </plat>

   <plat id="dessert" flag="froid">
           <name lang="fr">Tarte tomate-mozarella</name>
    </plat>
</repas>


Dans ton code XML essaye de decouper les differents élements communs pour chaques plats.

Et un conseil n'utilise pas de boucle "xsl:for-each"
si tu réussis.... tu auras tout compris au principe de base XSL.

Bon courage. Smiley biggrin
sylvain38 a écrit :

<xsl:variable name="selection" select="noeud"/>

C'est une moitié de la réponse à mon problème Smiley smile

sylvain38 a écrit :
Et un conseil n'utilise pas de boucle "xsl:for-each"
si tu réussis.... tu auras tout compris au principe de base XSL.

Il suffisait de le dire ! Smiley lol Merci pour ton aide, ces éléments vont me permettent d'avancer... jusqu'aux prochains problèmes Smiley biggrin