Quitter prématurément une boucle for-each ? - XML/XSL - Programmation
Marsh Posté le 27-10-2010 à 19:59:27
Non, XSL est un langage fonctionnel (mauvais, mais quand même), c'est pas du visual basic.
Si tu ne veux pas itérer sur toutes tes nodes, sélectionnes celles qui t'intéressent au lieu de faire des tests dégueulasses.
Marsh Posté le 27-10-2010 à 20:15:46
Bonsoir,
comment je fais pour les sélectionner ?... j'ai un XML de la forme
<bord>
<1>
<a></a>
<b></b>
<c></c>
<d>aaa</d>
</1>
...
<1>
<a></a>
<b></b>
<c></c>
<d>affr</d>
</1>
</bord>
Et je veux par ex dans un premier temps tester si on a 'affr' puis 'aaa' puis...
Marsh Posté le 27-10-2010 à 20:48:50
lalalallal a écrit : Bonsoir, |
Va falloir clarifier que ce que tu veux dire par "tester si ona affr puis aaa puis..." parce que là ça veut pas dire grand chose
Marsh Posté le 27-10-2010 à 21:02:18
Oui désolé
je regroupe deux XML : voiture.xml et garage.xml
<Voitures>
<Voiture>
<Id></Id>
<Modele></Modele>
<GarageId>123</GarageId>
</voiture>
...
<Voiture>
<Id></Id>
<Modele></Modele>
<GarageId>897</GarageId>
</voiture>
</voitures>
et
<garages>
<garage>
<Id>123</Id>
<adresse><adresse>
<garage>
...
<garage>
<Id>897</Id>
<adresse><adresse>
<garage>
</garages>
Donc pour ça j'ai créé un XSL qui parcourt le premier fichier (voiture)
recopie toutes les données sauf garageId.
Je veux remplacer <GarageId>897</GarageId> par
<garage>
<Id>897</Id>
<adresse><adresse>
<garage>
donc pour ça je stocke garageId (897 ici) dans une variable
puis je parcourt le fichier (garage.xml) avec une boucle for-each
et si document('garage.xml')/garages/garage/Id est égal à cette valeur j'affiche tout le noeud garage sinon je ne fait rien
au final j'obtient un fichier de la forme
<Voitures>
<Voiture>
<Id></Id>
<Modele></Modele>
<garage>
<Id>123</Id>
<adresse><adresse>
<garage>
</voiture>
...
<Voiture>
<Id></Id>
<Modele></Modele>
<garage>
<Id>897</Id>
<adresse><adresse>
<garage>
</voiture>
</voitures>
Marsh Posté le 27-10-2010 à 21:51:21
lalalallal a écrit : donc pour ça je stocke garageId (897 ici) dans une variable |
Alors que tu pourrais simplement sélectionner //garage[Id/text()=897]
Marsh Posté le 27-10-2010 à 22:05:10
^^ je me suis compliqué la vie pour rien...
Merci beaucoup !
je modifierai mon programme demain...
Bonne soirée !
Lalalallal
Marsh Posté le 27-10-2010 à 22:21:58
lalalallal a écrit : ^^ je me suis compliqué la vie pour rien... |
xsl n'est pas un langage impératif à la vb, souviens-t-en bien, c'est déjà peu lisible et peu maintenable quand c'est bien codé, mais si tu fais du vb en XSL tu vas vite te tirer une balle.
Et XPath est probablement la partie la plus agréable de faire des xsl (même si tu peux vite arriver à des trucs imbitables si tu fais pas attention), si tu comptes faire plus d'une ou 2 stylesheets par an je te conseille très fortement d'apprendre xpath en entier (spec w3c + zvon) ça te sera essentiel.
Marsh Posté le 27-10-2010 à 19:23:08
Bonsoir,
dans un script XSL j'utilise un <xsl:for-each></xsl:for-each> pour parcourir un fichier XML et à chaque fois un test <xsl:if test="..."></xsl:if> est effectué.
Si une certaine valeur est détectée alors elle est affichée <xsl:value-of select="..." /> sinon rien ne se passe.
Ce test est répété plusieurs fois (environ 957921 fois ^^) avec à chaque fois une valeur différente.
Je voudrais savoir s'il existe une instruction pour quitter le xsl:for-each une fois que la valeur a été trouvée. Un peu comme un "Exit For" en VBA que l'on mettrai dans le if après le xsl:value-of.
En effet, ça ne sert à rien de tester les 957921 valeurs si elle a été trouvée dès le premier test. (je recherche cela pour accélérer mon programme qui met 6 minutes pour s'exécuter :s )
J'espère ne pas être trop brouillon dans mes explications.
Merci d'avance,
Lalalallal