Je dois changer l'ordre dans lequel mon pour chacun n'est exécuté que si certaines conditions sont remplies.
Voici ce que mon XML ressemble à: p>
<xsl:sort select="position()" data-type="number" order="descending" />
3 Réponses :
Vérifiez si la première option a le nœud de nom ou non
<xsl:if test="Option/[position()=1]/@name">sort here</xsl:test>
Notez qu'un noeud XSL: trier code> ne peut pas être contenu dans un XSL: si code> nœud.
Vous pouvez utiliser un hack pour modifier l'ordre de tri basé sur une condition: le piratage est que évalue à ((vrai ()) code> retourne 1 et numéro (false ()) code> retourne 0. Comme conséquence, l'expression p> 1 code> si le premier option code> a un attribut code> nom code> et sur -1 code> sinon. Ceci est utilisé comme facteur pour inverser l'ordre de tri. P> < / p>
+1 De moi, parce que c'est presque la solution exacte que je suis indépendante il y a de manière indépendante. :)
+1 pour le calcul inverse. Mais le chemin est faux. À l'intérieur du XSL: Trier / @ Sélectionnez CODE> Le nœud de contexte est chaque élément Option code>, de sorte que le chemin relatif doit être ../ option [1] / @ Nom < / code>. De plus, je pense que vous devriez dire que cela peut être fait (plus verbose) avec xsl: choisissez code>, et ce serait le choix de la rigidité si la condition (qui a été évaluée pour chaque nœud) est devenue inédite.
Je ne suis pas un expert en XSL, mais celui-ci semble fonctionner mieux. En fin de compte, il serait plus facile s'il était possible de mettre une sorte dans un si! Ou avoir le tri directement dans le XML. Merci pour ton aide!
Ceci est naturel et facile et implique presque aucun hack. < / p> Lorsque cette transformation est effectuée sur ce document XML fort>: p> Le résultat correct est produit à nouveau strong>: p> strong> : La variable Nous utilisons également le fait que lorsque le signe de chaque numéro dans la séquence de nombres positifs croissants (les positions) est inversé, l'ordre de la nouvelle séquence devient diminué. P> P> $ VORDER code> est définie de telle manière que c'est -1 code> iff la première option code> (code> élément code> n'a pas de nom / Code> Attribut et c'est +1 CODE> Si la première option code> a un attribut code> nom code>. Nous utilisons ici le fait que false () code> est converti automatiquement vers 0 code> et true () code> à 1 code>. < / p>
Cette solution ne renverse pas l'ordre de tri de la liste des options, il ne suffira que des nœuds d'option vides à la fin de la liste. J'ai lu la question différemment, j'ai compris que toute la liste doit être inversée au cas où le premier élément d'option n'a pas d'attribut de nom. Bien sûr, si la liste n'a que deux articles, le résultat serait le même.
@ 0xa3: Merci de m'avoir alerter à cela. J'ai passé dix minutes pour résoudre le nouveau problème, l'a sauvé et ... a vu que c'est une copie presque exacte de la vôtre ... :(. Désolé.
Bonne question (+1). Voir ma réponse pour une solution complète et naturelle.
Serait-il possible pour la personne qui a fait voté cette question (5 ans et demi après son affichage et une réponse) pour s'expliquer?