Quitter prématurément une boucle for-each ?

Quitter prématurément une boucle for-each ? - XML/XSL - Programmation

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

Reply

Marsh Posté le 27-10-2010 à 19:23:08   

Reply

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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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

Reply

Marsh Posté le 27-10-2010 à 20:48:50    

lalalallal a écrit :

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


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 [:petrus75]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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>

Reply

Marsh Posté le 27-10-2010 à 21:51:21    

lalalallal a écrit :

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


Alors que tu pourrais simplement sélectionner //garage[Id/text()=897] [:petrus75]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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

Reply

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.


Message édité par masklinn le 27-10-2010 à 22:24:08

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed