IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

[XSLT] Condition d'unicité dans un for-each


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 11
    Points : 11
    Points
    11
    Par défaut [XSLT] Condition d'unicité dans un for-each
    Bonjour,

    Je dois migrer tout un soft depuis une machine 32 bits vers une 64bits.

    Entre autres features, il y a des transformations XSL dans le lot. L'une d'entre elle est vraiment bizarre car elle ne donne pas le même résultat en 32bits ou en 64bits... C'est sans doute que la bibliotheque utilisée doit planter en 64bits sans faire de logs ou d'erreur.... Malheureusement je n'ai pas trop la main là dessus.

    En désespoir de cause j'essaie de trouver un autre moyen d'effectuer la même opération, avec l'espoir que ça ne fera pas planter la transformation en 64bits cette fois.

    Mais pour ça encore faut-il que je comprenne comment l'originale fonctionne :-) Et il y a dedans une ligne que je ne parviens pas à piger. Il s'agit du passage en gras:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <xsl:key name="agents-by-domain" match="th:Agent" use="th:HawkDomain" />
    
    <xsl:template match="th:Agents">
    
    	<xsl:for-each select="th:Agent[count(. | key('agents-by-domain', th:HawkDomain)[1]) = 1]">
    		<xsl:sort select="th:HawkDomain" />
    
    (...)
    
    		<xsl:for-each select="key('agents-by-domain', th:HawkDomain)">
    			<xsl:sort select="th:AgentName" />
    
    (...)
    
    		</xsl:for-each>
    
    	</xsl:for-each>
     
    </xsl:template>
    Je sais ce que c'est censé faire: ranger les tags "Agent" par ordre de la valeur du sous-tag "HawkDomain", créant ainsi des sections "HawkDomain" où les "Agents" sont rangés par ordre alphabétique. C'est ce que ça fait sur le soft original en 32bit, mais en 64bit je me retrouve avec chacune des section répétée entièrement autant de fois qu'il y a d'agents dedans...

    Visiblement c'est donc au niveau de la condition en gras que ça doit pèter. Il s'agit vraisemblablement d'une condition permettant une sélection unique (censée éviter, justement, le problème que j'ai) mais je ne parviens pas à la cmprendre. Quelqu'un peut-il me l'expliquer?

    D'avance merci!!
    Luthier

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(. | key('agents-by-domain', th:HawkDomain)[1]) = 1]
    Cela vérifie l'existence de doublon th:HawkDomain, le for-each ne parse que les th:Agent dont le th:HawkDomain est unique dans le XML.
    Quant à dire que c'était ce qui était désiré.....
    Jamais vu ce type de code avant, on dirait un (très) mauvais filtre de doublon
    voir méthode MUENCH

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci!

    En fait j'ai fini par comprendre: il vérifie si le noeud actuel est le premier de la liste ayant le même HawkDomain, donc en gros il prend pour tous les hawkdomain à chaque fois uniquement le premier noeud ayant ce hawkdomain. C'est un style particulier en effet :-) Et je ne comprend toujours pas pourquoi ça ne marche pas sur le nouvel environnement, mais en prenant les generate-id ça marche, donc je m'emmerde pas et je prend ça...

    Merci encore!
    Luthier

Discussions similaires

  1. mettre une condition if dans un for each
    Par tony76 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 16/05/2015, 21h28
  2. [XSLT] XSLT sort dans un for-each avec select sur un param
    Par tralloc dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 23/11/2012, 09h06
  3. [XSLT][débutant] Problème xsl:value-of dans xsl:for-each
    Par Choubie dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 09/05/2007, 16h30
  4. [XSLT] Element parent dans un For-each
    Par Katachana dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/04/2007, 09h39
  5. [XSLT] Number dans un for-each
    Par stepd dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/08/2006, 13h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo