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 :

[XPath] preceding-sibling plusieurs criteres


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2006
    Messages : 380
    Points : 314
    Points
    314
    Par défaut [XPath] preceding-sibling plusieurs criteres
    Bonjour,
    J'ai un problème insoluble pour l'instant.
    Voici une partie du code xml de base
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    <DocumentElement>
      <Element>
        <Annee>2009</Annee>
        <Saison>Automne</Saison>
        <CodeDepartementPedagogique>EDIM</CodeDepartementPedagogique>
        <NomDepartementPedagogique>Ergonomie, design et ingénierie mécanique</NomDepartementPedagogique>
        <CodeFiliere>DIC</CodeFiliere>
        <NomFiliere>Design industriel et conception</NomFiliere>
        <ActiviteFiliere>Active</ActiviteFiliere>
      </Element>
      <Element>
        <Annee>2009</Annee>
        <Saison>Automne</Saison>
        <CodeDepartementPedagogique>EDIM</CodeDepartementPedagogique>
        <NomDepartementPedagogique>Ergonomie, design et ingénierie mécanique</NomDepartementPedagogique>
        <CodeFiliere>DMS</CodeFiliere>
        <NomFiliere>Design multi-sensoriel</NomFiliere>
        <ActiviteFiliere>Desactive</ActiviteFiliere>
      </Element>
      <Element>
    <Element>
        <Annee>2009</Annee>
        <Saison>Automne</Saison>
        <CodeDepartementPedagogique>GESC</CodeDepartementPedagogique>
        <NomDepartementPedagogique>Génie électrique et systèmes de commande</NomDepartementPedagogique>
        <CodeFiliere>ACM</CodeFiliere>
        <NomFiliere>Actionneurs et commande des systèmes mécatroniques</NomFiliere>
        <ActiviteFiliere>Active</ActiviteFiliere>
      </Element>
    ...
    ...
    <Element>
        <Annee>2010</Annee>
        <Saison>Printemps</Saison>
        <CodeDepartementPedagogique>EDIM</CodeDepartementPedagogique>
        <NomDepartementPedagogique>Ergonomie, design et ingénierie mécanique</NomDepartementPedagogique>
        <CodeFiliere>DIC</CodeFiliere>
        <NomFiliere>Design industriel et conception</NomFiliere>
        <ActiviteFiliere>Active</ActiviteFiliere>
      </Element>
      <Element>
        <Annee>2010</Annee>
        <Saison>Printemps</Saison>
        <CodeDepartementPedagogique>EDIM</CodeDepartementPedagogique>
        <NomDepartementPedagogique>Ergonomie, design et ingénierie mécanique</NomDepartementPedagogique>
        <CodeFiliere>DMS</CodeFiliere>
        <NomFiliere>Design multi-sensoriel</NomFiliere>
        <ActiviteFiliere>Desactive</ActiviteFiliere>
      </Element>
    ...
    ...
    </DocumentElement>
    Pour résumer le document, il y a une liste d'élément pour chaque élément il y a une année, une saison, un département, une filière.
    Chaque filière apparaît autant de fois qu'il y a d'années et de saisons pour lesquelles elles sont au programme. Chaque département apparaît autant de fois que ses filières sont au programme. Chaque année + saison apparaît autant de fois qu'une filière l'utilise.

    Je voudrais faire une requête XPath unique afin d'avoir une variable itérable qui me sorte uniquement et une seule fois par saison, tous les départements. Voici ce que j'ai essayé, mais c'est faux et je ne parviens pas à trouver la bonne expression.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:variable name="ListeDepartementEtablissement"
    			select="/DocumentElement/Element
    				[not (CodeDepartementPedagogique=preceding-sibling::Element/CodeDepartementPedagogique
    				and Annee=preceding-sibling::Element/Annee
    				and Saison=preceding-sibling::Element/Saison)]"/>
    J'ai bien compris pourquoi c'était faux, inutile de me l'expliquer, mais je n'arrive pas à trouver comment faire pour que ce soit juste. L'idée serait d'arriver à avoir un preceding sur tous les elements à la fois. J'ai voulu essayer un concat, je n'ai pas trouvé comment l'écrire et d'autres solustions dont je ne me souviens plus...
    En bref, je sèche

    Si vous avez un peu de temps à m'accorder ce serait très sympa !
    D'avance merci !

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2006
    Messages : 380
    Points : 314
    Points
    314
    Par défaut
    Pas d'amateur ?
    J'ai trouvé une solution mais qui ne me satisfait pas car elle a le désavantage d'être propriétaire.

    Pour ce faire il faut déclarer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    version="1.0">
    Ensuite voici un code xsl qui règle le problème :
    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
     
    <xsl:variable name="ListeDepartementFiliereEtablissement" select="/DocumentElement/Element"/>
    <xsl:variable name="PreListeDepartementEtablissement">
    			<xsl:for-each select="$ListeDepartementFiliereEtablissement[not(Annee=preceding-sibling::Element/Annee)]">
    				<xsl:variable name="Annee" select="Annee"/>
    				<xsl:value-of select="Annee"/>
    				<xsl:for-each select="$ListeDepartementFiliereEtablissement[$Annee=Annee][ not(Saison=preceding-sibling::Element[$Annee=Annee]/Saison)]">
    					<xsl:variable name="Saison" select="Saison"/>
    					<xsl:value-of select="Saison"/>
    					<xsl:for-each select="$ListeDepartementFiliereEtablissement[$Annee=Annee and $Saison=Saison]
    						[not (CodeDepartementPedagogique=preceding-sibling::Element[$Annee=Annee and $Saison=Saison]/CodeDepartementPedagogique)]">
    						<xsl:copy-of select="."/>
    					</xsl:for-each>
    				</xsl:for-each>
    			</xsl:for-each>
    		</xsl:variable>
    		<xsl:variable name="ListeDepartementEtablissement" select="msxsl:node-set($PreListeDepartementEtablissement)/Element"/>
    Pour expliquer celà, simplement les for-each me permettent de faire mes sélections plus finement, que par un simple xpath, ensuite, on concatène à l'intérieur tous les éléments sélectionnés, puis il faut déclarer que cet élément est un agrégat de noeud et on utilise msxsl:node-set pour le faire.

    L'ennuis c'est que si je n'utilisait pas un xslt microsoft, ça n'irait pas.
    Donc cette solution fonctionne mais d'une part elle n'est pas élégante (for-each imbriqués...) et elle est propriétaire (msxsl:node-set)

    J'aimerais trouver une meilleure solution.
    Si quelqu'un a une idée !!!

  3. #3
    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 : 48
    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
    Citation Envoyé par tralloc Voir le message
    Je voudrais faire une requête XPath unique afin d'avoir une variable itérable qui me sorte uniquement et une seule fois par saison, tous les départements.
    Ce n'est pas clair et comme le code que tu donnes pour la variable est faux et incomplet et je ne parle pas seulement du xpath, cela n'aide pas
    1)ton $ListeDepartementFiliereEtablissement c'est quoi exactement ?
    2)name="/ListeElement/Element" est faux est ce qu'il faut comprendre que ce xpath est celui qui remplace $ListeDepartementFiliereEtablissement

    Tu veux les <Element> sans doublons sur la combinaison Annee/Saison/CodeDepartementPedagogique ?

    Est tu obligé d'utiliser une variable parce que le preceding c'est couteux par rapport à du muench appliqué sur un for-each ou un apply.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2006
    Messages : 380
    Points : 314
    Points
    314
    Par défaut
    Bonjour Ervy,
    Désolé je n'arrive pas toujours à m'expliquer très clairement
    mais tu as bien compris :

    je
    veux les <Element> sans doublons sur la combinaison Annee/Saison/CodeDepartementPedagogique
    J'ai corrigé les erreurs

    - Il est vrai que mon xsl est un peu plus grand et je ne voulais pas tout publier pour ne pas dérouter le lecteur.


    Je suis un peu déçu qu'il n'existe pas d'autre solutions, j'aurais bien aimé trouver autre chose, surtout que j'utilise assez souvent ce genre de formule.
    Le langage xpath est puissant, cela m'étonne et me déçoit un peu qu'on ne puisse pas procéder autrement, en faisant une comparaison avec SQL, je crois qu'il est plus facile de traiter ce genre de choses, mais ce n'est pas mon problème actuel...

    Mais tant pis je ferai avec. Bien sûr si quelqu'un a une idée miracle...
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XPATH 1.0] Requête XPATH preceding-sibling
    Par cris83500 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 06/02/2012, 08h54
  2. XPath Différence entre preceding et preceding-sibling
    Par FwRamaro dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 16/07/2008, 11h15
  3. Probleme de dénombrement (precedent-sibling ?)
    Par Phach dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 30/01/2006, 17h54
  4. [xml] Xpath besoin d'explication sur preceding-sibling::
    Par ekmule dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 10/01/2006, 09h32
  5. [XPATH] following-sibling probleme
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 01/12/2005, 15h02

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