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 :

[XSL] : Comparaison de noeud


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mars 2007
    Messages : 258
    Points : 127
    Points
    127
    Par défaut [XSL] : xsl:for-each avec condition problème
    Bonjour à tous,

    Voilà 2 jours que je tourne en rond pour réussir à mettre en page mon xml via xsl

    Voici un exemple de 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
    128
    129
    130
    131
    132
    <ROWSET>
       <ROW num="1">
          <Id>85854</Id>
          <CONT_PRENOM>SOC. &amp; DE SANTE ASBL</CONT_PRENOM>
          <CONT_NOM>ASSOC. CHRETIENNE DES INSTITUTIONS</CONT_NOM>
          <NUM_CLIENT>4784314</NUM_CLIENT>
          <COAD_ADRESSE_DIRECTE>O</COAD_ADRESSE_DIRECTE>
          <CONT_CLIENT>C</CONT_CLIENT>
          <TCON_CODE>412 - MAISONS DE REPOS</TCON_CODE>
          <TIND_CODE>2608</TIND_CODE>
          <TIND_DESC>CBC BANQUE TOURNAI SUCCURSALE</TIND_DESC>
          <Adresse>AVENUE DE LA PAIRELLE, 33 B3</Adresse>
          <Localité>5000 NAMUR</Localité>
       </ROW>
       <ROW num="2">
          <Id>85854</Id>
          <CONT_PRENOM>SOC. &amp; DE SANTE ASBL</CONT_PRENOM>
          <CONT_NOM>ASSOC. CHRETIENNE DES INSTITUTIONS</CONT_NOM>
          <NUM_CLIENT>4784314</NUM_CLIENT>
          <COAD_ADRESSE_DIRECTE>O</COAD_ADRESSE_DIRECTE>
          <CONT_CLIENT>C</CONT_CLIENT>
          <TCON_CODE>412 - MAISONS DE REPOS</TCON_CODE>
          <TIND_CODE>2608</TIND_CODE>
          <TIND_DESC>CBC BANQUE TOURNAI SUCCURSALE</TIND_DESC>
          <Adresse>AVENUE DE LA PAIRELLE, 33-34 4</Adresse>
          <Localité>5000 NAMUR</Localité>
       </ROW>
       <ROW num="3">
          <Id>85854</Id>
          <CONT_PRENOM>SOC. &amp; DE SANTE ASBL</CONT_PRENOM>
          <CONT_NOM>ASSOC. CHRETIENNE DES INSTITUTIONS</CONT_NOM>
          <NUM_CLIENT>4784314</NUM_CLIENT>
          <COAD_ADRESSE_DIRECTE>O</COAD_ADRESSE_DIRECTE>
          <CONT_CLIENT>C</CONT_CLIENT>
          <TCON_CODE>412 - MAISONS DE REPOS</TCON_CODE>
          <TIND_CODE>2640</TIND_CODE>
          <TIND_DESC>CBC BANQUE MONS SUCCURSALE</TIND_DESC>
          <Adresse>AVENUE DE LA PAIRELLE, 33 B3</Adresse>
          <Localité>5000 NAMUR</Localité>
       </ROW>
       <ROW num="4">
          <Id>85854</Id>
          <CONT_PRENOM>SOC. &amp; DE SANTE ASBL</CONT_PRENOM>
          <CONT_NOM>ASSOC. CHRETIENNE DES INSTITUTIONS</CONT_NOM>
          <NUM_CLIENT>4784314</NUM_CLIENT>
          <COAD_ADRESSE_DIRECTE>O</COAD_ADRESSE_DIRECTE>
          <CONT_CLIENT>C</CONT_CLIENT>
          <TCON_CODE>412 - MAISONS DE REPOS</TCON_CODE>
          <TIND_CODE>2640</TIND_CODE>
          <TIND_DESC>CBC BANQUE MONS SUCCURSALE</TIND_DESC>
          <Adresse>AVENUE DE LA PAIRELLE, 33-34 4</Adresse>
          <Localité>5000 NAMUR</Localité>
       </ROW>
       <ROW num="5">
          <Id>85854</Id>
          <CONT_PRENOM>SOC. &amp; DE SANTE ASBL</CONT_PRENOM>
          <CONT_NOM>ASSOC. CHRETIENNE DES INSTITUTIONS</CONT_NOM>
          <NUM_CLIENT>4784314</NUM_CLIENT>
          <COAD_ADRESSE_DIRECTE>O</COAD_ADRESSE_DIRECTE>
          <CONT_CLIENT>C</CONT_CLIENT>
          <TCON_CODE>412 - MAISONS DE REPOS</TCON_CODE>
          <TIND_CODE>2853</TIND_CODE>
          <TIND_DESC>CBC GESTION PRIVEE</TIND_DESC>
          <Adresse>AVENUE DE LA PAIRELLE, 33-34 4</Adresse>
          <Localité>5000 NAMUR</Localité>
       </ROW>
       <ROW num="6">
          <Id>85854</Id>
          <CONT_PRENOM>SOC. &amp; DE SANTE ASBL</CONT_PRENOM>
          <CONT_NOM>ASSOC. CHRETIENNE DES INSTITUTIONS</CONT_NOM>
          <NUM_CLIENT>4784314</NUM_CLIENT>
          <COAD_ADRESSE_DIRECTE>O</COAD_ADRESSE_DIRECTE>
          <CONT_CLIENT>C</CONT_CLIENT>
          <TCON_CODE>412 - MAISONS DE REPOS</TCON_CODE>
          <TIND_CODE>2664</TIND_CODE>
          <TIND_DESC>CBC BANQUE NAMUR SUCCURSALE</TIND_DESC>
          <Adresse>AVENUE DE LA PAIRELLE, 33-34 4</Adresse>
          <Localité>5000 NAMUR</Localité>
       </ROW>
       <ROW num="7">
          <Id>85854</Id>
          <CONT_PRENOM>SOC. &amp; DE SANTE ASBL</CONT_PRENOM>
          <CONT_NOM>ASSOC. CHRETIENNE DES INSTITUTIONS</CONT_NOM>
          <NUM_CLIENT>4784314</NUM_CLIENT>
          <COAD_ADRESSE_DIRECTE>O</COAD_ADRESSE_DIRECTE>
          <CONT_CLIENT>C</CONT_CLIENT>
          <TCON_CODE>412 - MAISONS DE REPOS</TCON_CODE>
          <TIND_CODE>2757</TIND_CODE>
          <TIND_DESC>CBC BANQUE NAMUR SUCCURSALE-GE</TIND_DESC>
          <Adresse>AVENUE DE LA PAIRELLE, 33 B3</Adresse>
          <Localité>5000 NAMUR</Localité>
       </ROW>
       <ROW num="8">
          <Id>85854</Id>
          <CONT_PRENOM>SOC. &amp; DE SANTE ASBL</CONT_PRENOM>
          <CONT_NOM>ASSOC. CHRETIENNE DES INSTITUTIONS</CONT_NOM>
          <NUM_CLIENT>4784314</NUM_CLIENT>
          <COAD_ADRESSE_DIRECTE>O</COAD_ADRESSE_DIRECTE>
          <CONT_CLIENT>C</CONT_CLIENT>
          <TCON_CODE>412 - MAISONS DE REPOS</TCON_CODE>
          <TIND_CODE>2757</TIND_CODE>
          <TIND_DESC>CBC BANQUE NAMUR SUCCURSALE-GE</TIND_DESC>
          <Adresse>AVENUE DE LA PAIRELLE, 33-34 4</Adresse>
          <Localité>5000 NAMUR</Localité>
       </ROW>
       <ROW num="9">
          <Id>85854</Id>
          <CONT_PRENOM>SOC. &amp; DE SANTE ASBL</CONT_PRENOM>
          <CONT_NOM>ASSOC. CHRETIENNE DES INSTITUTIONS</CONT_NOM>
          <NUM_CLIENT>4784314</NUM_CLIENT>
          <COAD_ADRESSE_DIRECTE>O</COAD_ADRESSE_DIRECTE>
          <CONT_CLIENT>C</CONT_CLIENT>
          <TCON_CODE>412 - MAISONS DE REPOS</TCON_CODE>
          <TIND_CODE>2853</TIND_CODE>
          <TIND_DESC>CBC GESTION PRIVEE</TIND_DESC>
          <Adresse>AVENUE DE LA PAIRELLE, 33 B3</Adresse>
          <Localité>5000 NAMUR</Localité>
       </ROW>
       <ROW num="10">
          <Id>85854</Id>
          <CONT_PRENOM>SOC. &amp; DE SANTE ASBL</CONT_PRENOM>
          <CONT_NOM>ASSOC. CHRETIENNE DES INSTITUTIONS</CONT_NOM>
          <NUM_CLIENT>4784314</NUM_CLIENT>
          <COAD_ADRESSE_DIRECTE>O</COAD_ADRESSE_DIRECTE>
          <CONT_CLIENT>C</CONT_CLIENT>
          <TCON_CODE>412 - MAISONS DE REPOS</TCON_CODE>
          <TIND_CODE>2664</TIND_CODE>
          <TIND_DESC>CBC BANQUE NAMUR SUCCURSALE</TIND_DESC>
          <Adresse>AVENUE DE LA PAIRELLE, 33 B3</Adresse>
          <Localité>5000 NAMUR</Localité>
       </ROW>
    </ROWSET>
    Donc voici un exemple de recherche pour 1 client
    Attention, un client peux posséder maximum 2 adresses mais être reliés à plusieurs TIND_CODE dans le cas ci-dessus il y a 5 TIND_CODE.
    Donc mon code actuel affiche le client suivi de 10 adresses.

    Je voudrais qu'il affiche que les adresses qui sont différentes, donc par exemple pour le cas ci-dessus, je voudrais qu'il affiche une fois le client et ensuite les 2 adresses.

    Ci-joint mon code actuel

    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
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    	<xsl:template match="/">
    	<HTML>
    		<HEAD>
    			<LINK rel="stylesheet" href='html/mcic/style/CBCinet.css'/>
    			<LINK rel="stylesheet" href='html/mcic/style/mcic.css'/>
    		</HEAD>
    		<BODY onload="parent.frDown.location.href='html/mcic/blank.html';">
    			<TABLE width="100%" border="0" cellspacing='0'>
    				<TR>
    				<TD>
    				<xsl:apply-templates select="ROWSET/ROW"/>
     
    				</TD>
    				</TR>
    			</TABLE>
    			<!-- Message si aucun ROW n'est détecté-->
    			<xsl:if test= "not(/ROWSET/ROW)">
    				<BR/>
    				<TABLE border='0' width='100%'>
    					<TR align='center'><TD>
    						<LABEL>Aucun résultat !</LABEL>
    					</TD></TR>
    				</TABLE>
    			</xsl:if>
    		</BODY>
    	</HTML>
    	</xsl:template>
     
    	<xsl:template match="ROW">
     
    	<xsl:variable name="currid">
    		<xsl:value-of select="Id"/>
    	</xsl:variable>
    	<xsl:variable name="nextid">
    		<xsl:value-of select="following-sibling::*[1]/Id"/>
    	</xsl:variable>
    	<xsl:variable name="previd">
    		<xsl:value-of select="preceding-sibling::*[1]/Id"/>
    	</xsl:variable>
    	<xsl:variable name="adr_suppr">
    		<xsl:value-of select="ADR_SUPPRIMEE"/>
    	</xsl:variable>
     
    	<xsl:variable name="currad">
    		<xsl:value-of select="Adresse"/>
    	</xsl:variable>
    	<xsl:variable name="nextad">
    		<xsl:value-of select="following-sibling::*[1]/Adresse"/>
    	</xsl:variable>
    	<xsl:variable name="prevad">
    		<xsl:value-of select="preceding-sibling::*[1]/Adresse"/>
    	</xsl:variable>
     
     
    	<TABLE  border='1'  width='100%' bordercolor ='blue' >
    	<xsl:if test="@num = '1' or $previd != $currid or $previd=$currid">
    		<!-- dans ce cas, on est en début de fiche => on utilise la classe fiche-recherche-top -->
    		<xsl:attribute name="class">fiche-recherche-top</xsl:attribute>
    	</xsl:if>
    	<xsl:if test="$previd=$currid and $nextid = $currid ">
    		<!-- dans ce cas, on est  en milieu de fiche => on utilise la classe fiche-recherche-middle -->
    		<xsl:attribute name="class">fiche-recherche-middle</xsl:attribute>
    	</xsl:if>
    	<xsl:if test="$nextid != $currid">
    		<!-- dans ce cas, on est en fin de fiche => on utilise la classe fiche-recherche-bottom -->
    		<xsl:attribute name="class">fiche-recherche-bottom</xsl:attribute>
    	</xsl:if>
    	<!--test si le précédent est le meme ou non-->
    	<xsl:if test="@num = '1' or $previd != $currid">
    		<THEAD>
    			<TH align='left'>
    				<A target='frCenter' title='Aller à la fiche contact' class='header'>    
    				<xsl:attribute name="href">/MCIC/Contact?contid=<xsl:value-of select="Id"/></xsl:attribute>
    				<xsl:value-of select="CONT_PRENOM"/>*<xsl:value-of select="CONT_NOM"/>
    				( <xsl:value-of select="NUM_CLIENT"/> )<BR/>
    				</A>
    			</TH>
    		</THEAD>
     
    	</xsl:if>
     
    		<TBODY>
     
    			<TR>
    				<TD>
    					<xsl:value-of select="Adresse"/><BR/>
    				</TD>
    			</TR>
    			<TR>
    				<TD>
    					<xsl:value-of select="Localité"/><BR/>
    				</TD>
    			</TR>
     
     
    		</TBODY>
     
    	</TABLE>
    		<xsl:if test="$nextid != $currid">
    		<BR/>
    		</xsl:if>
    	</xsl:template>
     
     
     
    </xsl:stylesheet>
    Et voici un exemple de ce que je voudrais avoir en retour

    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
    SOC. & DE SANTE ASBL ASSOC. CHRETIENNE DES INSTITUTIONS ( 4784314 )
    AVENUE DE LA PAIRELLE, 33 B3
    5000 NAMUR
    Code indice : 2608
    Code indice : 2640
    Code indice : 2757
    Code indice : 2853
    Code indice : 2664
     
    AVENUE DE LA PAIRELLE, 33-34 4
    5000 NAMUR 
    Code indice : 2608
    Code indice : 2640
    Code indice : 2853
    Code indice : 2664
    Code indice : 2757
    Je voudrais donc qu'il affiche une seul fois le nom, là, il n'y a pas de problème, je voudrais qu'il affiche les 2 adresses si elles sont différentes et je voudrais qu'il affiche tout les codes indices en relation avec l'adresse.

    Si vous avez une piste, je suis preneur

    D'avance merci à tous pour votre aide

  2. #2
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mars 2007
    Messages : 258
    Points : 127
    Points
    127
    Par défaut
    Voilà, j'ai modifié mon xsl et le résultat n'est pas trop mauvais.

    J'arrive à avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SOC. & DE SANTE ASBL ASSOC. CHRETIENNE DES INSTITUTIONS ( 4784314 )
    AVENUE DE LA PAIRELLE, 33 B3 
    AVENUE DE LA PAIRELLE, 33-34 4
    Malheureusement cela ne fonctionnne que si je fais la recherche sur 1 seul contact, par contre si je fais une recherche sur plusieurs contact, j'obtiens les adresse de tout le monde dans tous les contacts, c'est logique vu que j'utilise le code suivant :

    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
    <xsl:if test="@num = '1' or $previd != $currid">
    <THEAD>
      <TH align='left'>
          <A target='frCenter' title='Aller à la fiche contact' class='header'>    
             <xsl:attribute name="href">/MCIC/Contact?contid=<xsl:value-of select="Id"/></xsl:attribute>
             <xsl:value-of select="CONT_PRENOM"/>*<xsl:value-of select="CONT_NOM"/>
             ( <xsl:value-of select="NUM_CLIENT"/> )<BR/>
          </A>
       </TH>
    </THEAD>
     
    </xsl:if>
     
    <TBODY>
     
       <xsl:if test="@num = '1' or $previd != $currid">		
       <xsl:for-each select="//Adresse[not(.=preceding::Adresse)]/Id">
     
          <TR>
             <TD>
                <xsl:value-of select="."/><BR/>
             </TD>
          </TR>
     
       </xsl:for-each>
       </xsl:if>
    Donc, il faudrait qu'il effectue la recherche sur l'id courant.

    Si vous avez une petite idée pour moi ???

    Encore merci à tous

  3. #3
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mars 2007
    Messages : 258
    Points : 127
    Points
    127
    Par défaut
    J'arrive pratiquement à avoir la solution :

    Avec le code suivant

    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
    <TBODY>
     
    <xsl:choose> 
       <xsl:when test="not(Adresse=preceding-sibling::ROW[Id=current()/Id]/Adresse)">
          <TR>
             <TD>
                <xsl:value-of select="Adresse"/><BR/>
                <xsl:value-of select="Localité"/><BR/>
     
                <xsl:for-each select="/TIND_CODE[not(.=preceding::TIND_CODE)]">
     
                   <TR>
    		  <TD>
    		     Code indice : <xsl:value-of select="."/><BR/>
    		  </TD>
    	       </TR>
     
       	    </xsl:for-each>
             </TD>
          </TR>
       </xsl:when>
    </xsl:choose>
     
    </TBODY>
    J'arrive à avoir :

    - 1 adresse (Si les 2 adresses sont identiques)
    - 2 adresses (Si les 2 adresses sont différentes)

    Les 2 adresses sont bien séparées

    Maintenant je dois afficher les différents indices par agence.

    Avec mon code cela fonction si je fais une recherche pour 1 client, par contre si je recherche sur pluseurs client, il affiche tous les indices de tous les clients disponibles dans la recherche.

    Et je ne parvient pas à faire un when du même type que l'adresse mais pour l'indice !!

    Avez vous une petite idée ???

  4. #4
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mars 2007
    Messages : 258
    Points : 127
    Points
    127
    Par défaut Problème résolu
    Problème résolu

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/06/2006, 17h18
  2. [XSL] egalité de noeud
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 14/01/2006, 23h58
  3. [xml/xsl] Problème de noeuds et attributs
    Par Avallach dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 14/01/2006, 14h31
  4. [XSL] Accès à un noeud dans une boucle
    Par Trin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 15/11/2005, 14h32
  5. xsl ---> filtrage des noeuds avec "not"
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 12/07/2005, 11h26

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