7
votes

Comment puis-je modifier l'ordre d'un XSL pour chacun?

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


2 commentaires

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?


3 Réponses :


0
votes

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>


1 commentaires

Notez qu'un noeud XSL: trier ne peut pas être contenu dans un XSL: si nœud.



9
votes

Vous pouvez utiliser un hack pour modifier l'ordre de tri basé sur une condition: xxx

le piratage est que ((vrai ()) retourne 1 et numéro (false ()) retourne 0. Comme conséquence, l'expression xxx

évalue à 1 si le premier option a un attribut nom et sur -1 sinon. Ceci est utilisé comme facteur pour inverser l'ordre de tri. < / p>


3 commentaires

+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 Le nœud de contexte est chaque élément Option , 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 , 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!



1
votes

L'ordre de production de la sortie souhaité peut être facilement spécifié avec :

Ceci est naturel et facile et implique presque aucun hack. < / p> xxx

Lorsque cette transformation est effectuée sur ce document XML : xxx

Le résultat correct est produit : xxx

lorsque la même transformation est maintenant effectuée sur ce document XML : : xxx

Le résultat correct est produit à nouveau : xxx

: La variable $ VORDER est définie de telle manière que c'est -1 iff la première option (code> élément n'a pas de nom / Code> Attribut et c'est +1 Si la première option a un attribut nom . Nous utilisons ici le fait que false () est converti automatiquement vers 0 et true () à 1 . < / p>

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é.


2 commentaires

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é.