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 :

Clause Distinct


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 16
    Par défaut Clause Distinct
    Bonjour,

    Je travaille actuellement avec iReport et pour la première fois je suis confronter aux requêtes XPath. Pour commencer, voici mon fichier XML

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    <env id="41">
     
    	<name>Habilitations</name>
     
    	<!-- Definition des services -->
    	<service id="411" envid="41 ">
    		<name>Hopital</name>
    	</service>
    	<service id="412" envid="41 ">
    		<name>Clinique</name>
    	</service>
     
    	<!-- Definition des sous-services du service Hopital -->
    	<sous-service id="413" envid="411">
    		<name>Bloc Chirurgical</name>
    	</sous-service>
    	<sous-service id="414" envid="411">
    		<name>Urgence</name>
    	</sous-service>
     
    	<!-- Definition des sous-services du service Clinique -->
    	<sous-service id="415" envid="412">
    		<name>Pediatrie</name>
    	</sous-service>
    	<sous-service id="416" envid="412">
    		<name>Maternite</name>
    	</sous-service>
     
    	<!-- Groupe d'utilisateurs du sous-service Bloc Chirurgical-->
    	<groupe id="417" envid="413">
    		<name>Chirurgiens</name>
    	</groupe>
    	<groupe id="418" envid="413">
    		<name>Anesthesiste</name>
    	</groupe>
     
    	<!-- Clement a ete defini dans le groupe chirurgien et reutilise dans le groupe Anesthesiste-->
    	<user id="419" envid="417">
    		<name>Clement</name>
    	</user>
    	<user id="419" envid="418" reused="true">
    		<name>Clement</name>
    	</user>
     
    	<!-- Christophe a ete defini directement dans le groupe Anesthesiste -->
    	<user id="420" envid="418">
    		<name>Christophe</name>
    	</user>
     
    	<!-- Estelle a ete defini dans le sous-service Bloc Chirurgical et reutilise dans le groupe Chirurgiens -->
    	<user id="421" envid="413">
    		<name>Estelle</name>
    	</user>
    	<user id="421" envid="417" reused="true">
    		<name>Estelle</name>
    	</user>
     
    	<!-- Loic a ete defini dans le sous-service Urgence -->
    	<user id="422" envid="414">
    		<name>Loic</name>
    	</user>
     
    	<!-- Damien a ete defini dans le sous-service Pediatrie du service clinique-->
    	<user id="423" envid="415">
    		<name>Damien</name>
    	</user>
     
    	<!-- Thibaud a ete defini dans le sous-service Maternite du service clinique -->
    	<user id="424" envid="416">
    		<name>Thibaud</name>
    	</user>
     
    	<!-- Guillaume a ete defini dans le group chirurgien du sous-service Bloc chirurgical et reutilise dans le sous service Maternite du service Clinique -->
    	<user id="425" envid="417">
    		<name>Guillaume</name>
    	</user>
    	<user id="425" envid="416" reused="true">
    		<name>Guillaume</name>
    	</user>
     
    	<!-- Le groupe Direction est defini dans le sous-service Bloc-chirurgical -->
    	<groupe id="426" envid="413">
    		<name>Direction</name>
    	</groupe>
     
    	<!-- Le groupe Direction est reutilise dans le sous-service Pediatrie-->
    	<groupe id="426" envid="415" reused="true">
    		<name>Direction</name>
    	</groupe>
     
    	<!-- Le groupe Direction est reutilise dans le sous-service Maternite-->
    	<groupe id="426" envid="416" reused="true">
    		<name>Direction</name>
    	</groupe>
     
    	<!-- Ci-dessous les utilisateurs definie dans le groupe Direction -->
    	<user id="427" envid="426">
    		<name>Yannick</name>
    	</user>
    	<user id="428" envid="426">
    		<name>Olivier</name>
    	</user>
    	<!-- Tenter de rajouter Loic egalement-->
    	<user id="422" envid="426" reused="true">
    		<name>Loic</name>
    	</user>
     
    	<!-- Creation d'un groupe sage femme dans le sous-service Maternite-->
    	<groupe envid="416">
    		<id>429</id>
    		<name>Sages femmes</name>
    	</groupe>
     
    	<!-- Creation d'un user présent dans le groupe sage-femme du sous-service Maternite et réutilisé dans le groupe chirurgiens du sous-service Bloc Chirurgical (ce sont des sous-services de services différents) -->
    	<user envid="429">
    		<id>430</id>
    		<name>Dominique</name>
    	</user>
     
    	<user envid="417" reused="true">
    		<id>430</id>
    		<name>Dominique</name>
    	</user>
     
     
    </env>
    Je souhaite récupérer les users qui sont directement attaché à un sous-service (via envid) ou indirectement via un sous-groupe (les liaisons se font par l'attribut envid). Après récupération des users je veux faire un distinct sur les attributs id des users.

    Voici la requête que j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /env/user[not(@id = preceding-sibling::user[(@envid=(/env/groupe[@envid='$P{FM_SOUS_SERVICE_ID}']/@id)) or (@envid='$P{FM_SOUS_SERVICE_ID}')]/@id)]
    Le problème est que le "distinct" n'est pas toujours fait correctement ? Quelqu'un a-t-il une idée pour faire ça. Je suis preneur en XPATH et/ou en XPATH2

    Je vous remercie par avance,

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    [0] Pour simplifier la vie, je suppose qu'il y ait constance dans la construction des groupes et users dans le sens que l'id soit un attribut tout au long au lieu que parfois il soit un attribut et parfois il soit un sous-balise. Par exemple,
    <groupe envid="416">
    <id>429</id>
    <name>Sages femmes</name>
    </groupe>
    devrait récrire comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <groupe id="429" envid="416">
        <name>Sages femmes</name>
    </groupe>
    [1] Etant donné [0], on peut faire avec des construction comme ceci avec xpath 2.0 dans xslt 2.0.
    [1.1] Définir d'abord un paramètre et un clé comme on fait xslt 1.0 ou 2.0, supposons par défault on va sélectionner le sous-service 413.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:param name="ssid" select="'413'" />
    <xsl:key name="groupkey" match="groupe" use="@envid" />
    avec ssid etant une donnée d'identifier le sous-service.
    [1.2] Supposons "/" etant le contexte noeud, ceci donne les resultats désirés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:for-each select="distinct-values(env/data(user[@envid=$ssid or @envid=key('groupkey', $ssid)/@id]/name))">
        <user><xsl:value-of select="." /></user>
    </xsl:for-each>
    [1.2.1] Encore une variation possible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:for-each-group select="env/user[@envid=$ssid or @envid=key('groupkey', $ssid)/@id]" group-by="name">
        <user><xsl:value-of select="current-group()/name[1]" /></user>
    </xsl:for-each-group>
    [2] On peut evidemment le faire avec xpath 1.0 dans xslt 1.0 et il n'est pas plus compliqué hors de proportion. Il suffit de faire un controle si le 'user' est directement lié au sous-service ou non. Si c'est oui (@envid=$ssid), accepte le; si c'est non, accept seulement le 'user' avec @envid égale à @id du premier groupe lié au sous-service etc...

Discussions similaires

  1. clause Distinct dans requête access
    Par lbar012001 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 15/02/2007, 10h28
  2. [9i, débutant] Clause DISTINCT sur un seul champ
    Par JYves dans le forum Oracle
    Réponses: 11
    Dernier message: 06/09/2006, 17h08
  3. Clause Distinct ne fonctionne pas su SELECT multiple
    Par fabou3377 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 04/08/2006, 11h39
  4. Réponses: 3
    Dernier message: 11/04/2006, 10h36
  5. Clause DISTINCT
    Par mathieu77186 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/03/2005, 12h37

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