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 :

Unicité des clés XSL


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
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Par défaut Unicité des clés XSL
    Bonjour,

    je reposte un vieux problème dont voici les données d'entrées :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="simple_view.xslt"?>
    <REPORT>
         <RDSSTATUS>0</RDSSTATUS>
         <RDSMESSAGE>
         </RDSMESSAGE>
         <EXPRESSION type="multi">
              <MULTI>
                   <INSTANCE name="Client" cast="String" key="true" trend="false">
                        <ITEM end='-1' start='-1'>hostname1</ITEM>
                   </INSTANCE>
                   <INSTANCE name="Status" cast="String" key="false" trend="false">
                        <ITEM end='1298489695' start='1298489695'>success</ITEM>
                   </INSTANCE>
              </MULTI>
              <MULTI>
                   <INSTANCE name="Client" cast="String" key="true" trend="false">
                        <ITEM end='-1' start='-1'>hostname1</ITEM>
                   </INSTANCE>
                   <INSTANCE name="Status" cast="String" key="false" trend="false">
                        <ITEM end='1298489754' start='1298489754'>success</ITEM>
                   </INSTANCE>
              </MULTI>
              <MULTI name="LabCdc">
                   <INSTANCE name="Client" cast="String" key="true" trend="false">
                        <ITEM end='-1' start='-1'>hostname1</ITEM>
                   </INSTANCE>
                   <INSTANCE name="Status" cast="String" key="false" trend="false">
                        <ITEM end='1298489695' start='1298489695'>success</ITEM>
                   </INSTANCE>
              </MULTI>
              <MULTI name="LabCdc">
                   <INSTANCE name="Client" cast="String" key="true" trend="false">
                        <ITEM end='-1' start='-1'>hostname1</ITEM>
                   </INSTANCE>
                   <INSTANCE name="Status" cast="String" key="false" trend="false">
                        <ITEM end='1298489695' start='1298489695'>success</ITEM>
                   </INSTANCE>
              </MULTI>
              <MULTI name="LabCdc">
                   <INSTANCE name="Client" cast="String" key="true" trend="false">
                        <ITEM end='-1' start='-1'>hostname2</ITEM>
                   </INSTANCE>
                   <INSTANCE name="Status" cast="String" key="false" trend="false">
                        <ITEM end='1298489695' start='1298489695'>success</ITEM>
                   </INSTANCE>
              </MULTI>
              <MULTI name="LabCdc">
                   <INSTANCE name="Client" cast="String" key="true" trend="false">
                        <ITEM end='-1' start='-1'>hostname2</ITEM>
                   </INSTANCE>
                   <INSTANCE name="Status" cast="String" key="false" trend="false">
                        <ITEM end='1298490092' start='1298490092'>success</ITEM>
                   </INSTANCE>
              </MULTI>
              <MULTI name="LabCdc">
                   <INSTANCE name="Client" cast="String" key="true" trend="false">
                        <ITEM end='-1' start='-1'>hostname2</ITEM>
                   </INSTANCE>
                   <INSTANCE name="Status" cast="String" key="false" trend="false">
                        <ITEM end='1298489695' start='1298489695'>failed</ITEM>
                   </INSTANCE>
              </MULTI>
         </EXPRESSION>
    </REPORT>
    Pour l'instant j'utilise ce XSL :
    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
     
    <xsl:stylesheet id="stylesheet" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    	<xsl:key name="client_status" match="/REPORT/EXPRESSION[1]/MULTI" use="concat(INSTANCE[@name='Client']/ITEM, '_', INSTANCE[@name='Status']/ITEM)"/>
    	<xsl:template match="REPORT">
         <xsl:apply-templates select="/REPORT/EXPRESSION[1]"/>
    	</xsl:template>
    	<xsl:template match="/REPORT/EXPRESSION[1]">
    		<xsl:for-each select="//MULTI[generate-id() = generate-id(key('client_status', concat(INSTANCE[@name='Client']/ITEM, '_', INSTANCE[@name='Status']/ITEM))[1])]">
    			<xsl:sort select="INSTANCE[@name='Client']/ITEM"/>	
    			<xsl:choose>	
    			<xsl:when test="INSTANCE[@name='Status']/ITEM = 'failed'">		
    <xsl:text>
    failed</xsl:text>
    				<xsl:value-of select="INSTANCE[@name='Client']/ITEM"/>
    			</xsl:when>
    				<xsl:otherwise>
    					<xsl:text>
    success</xsl:text>
    					<xsl:value-of select="INSTANCE[@name='Client']/ITEM"/>
    				</xsl:otherwise>
    			</xsl:choose>
    <xsl:text>
     
    </xsl:text>
    		</xsl:for-each>
    	</xsl:template>
    </xsl:stylesheet>
    J'obtiens le résultat suivant :
    successhostname1


    successhostname2


    failedhostname2
    Ce que je cherche à faire c'est de me retrouver avec une ligne par hostname. Si le couple failed hostnameX est trouvé alors je n'affiche que celui la. Je ne veux afficher le "success" s'il existe au moins un failed pour ce hostname. Cet exemple se retrouve dans ma sortie ci-dessus.
    je souhaite alors obtenir :
    successhostname1


    failedhostname2
    La solution XSL que j'utilisais ne peux pas marcher car je filtre sur le couple hostname+status. Cependant apres plusieurs essais vains, je n'arrive pas à trouver une solution viable. Je pensais à de l'imbrication de for-each mais pas trouvé!

    merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Tu n'as qu'à filtrer uniquement sur le hostname.

    Pour chaque hostname, s'il existe un status failed pour lui, afficher le status failed. Sinon, afficher le status success.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Je pense que le plus simple serait de faire un test d'existence du "fail" dans le cas d'un success et de ne pas afficher le success s'il ne le faut pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:variable name="client" value="INSTANCE[@name='Client']/ITEM"/>
    <xsl:if test="not("/REPORT/EXPRESSION/MULTI[generate-id() = generate-id(key('client_status', concat($client, '_failed')))]")">
      <xsl:text>success</xsl:text>
      <xsl:value-of select="INSTANCE[@name='Client']/ITEM"/>
    </xsl:if>
    Edit :
    La solution de thelvin est pas mal non plus : faire ta clef sur le hostname uniquement (on s'est croisé).

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Par défaut erreur parsing
    en utilisant la méthode évoqué par loceka, je n'ai pas d'erreur dans mon debugger mais mon navigateur me sort Error loading stylesheet: Parsing an XSLT stylesheet failed.
    Voici le XSL utilisé :
    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:stylesheet id="stylesheet" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    	<xsl:key name="client_status" match="/REPORT/EXPRESSION[1]/MULTI" use="concat(INSTANCE[@name='Client']/ITEM, '_', INSTANCE[@name='Status']/ITEM)"/>
    	<xsl:template match="REPORT">
         <xsl:apply-templates select="/REPORT/EXPRESSION[1]"/>
    	</xsl:template>
    	<xsl:template match="/REPORT/EXPRESSION[1]">
    		<xsl:for-each select="//MULTI[generate-id() = generate-id(key('client_status', concat(INSTANCE[@name='Client']/ITEM, '_', INSTANCE[@name='Status']/ITEM))[1])]">
    			<xsl:variable name="client" value="INSTANCE[@name='Client']/ITEM"/>
    			 <xsl:if test="not(/REPORT/EXPRESSION/MULTI[generate-id() = generate-id(key('client_status', concat($client, '_failed')))])">
    			      <xsl:text>success</xsl:text>
    			      <xsl:value-of select="INSTANCE[@name='Client']/ITEM"/>
    			 </xsl:if>
    		</xsl:for-each>
    	</xsl:template>
    </xsl:stylesheet>

  5. #5
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Déjà ma méthode supposait que tu conserves ton code tel que tu l'avais montré (avec le choose etc., seul le otherwise devait être modifié) mais ça ne changerait rien au problème que tu as.

    Le truc c'est que je me suis trompé, xsl:variable s'écrit avec un attribut "select" et non "value" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="client" select="INSTANCE[@name='Client']/ITEM"/>

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Par défaut Résolu
    merci

    Loceka effectivement ce n'était que ça!! Bien vu!

    En plaçant le code dans mo otherwise ça fait exactement ce dont j'avais besoin

    merci encore pour votre aide

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Tout cela m'a l'air bien inutilement compliqué.

    Ceux qui veulent apprendre, je suggère de relire mon précédent message -_-°.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Par défaut info : solution plus simple
    bonjour ,

    je relance un peu ce thread car j'aurais aimé connaitre la solution plus simple de thelvin!!

    Donc Thelvin tu aurais un xsl comme ça ? :

    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
    <xsl:stylesheet id="stylesheet" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    	<xsl:key name="client_status" match="/REPORT/EXPRESSION[1]/MULTI" use="INSTANCE[@name='Client']/ITEM"/>
    	<xsl:template match="REPORT">
         <xsl:apply-templates select="/REPORT/EXPRESSION[1]"/>
    	</xsl:template>
    	<xsl:template match="/REPORT/EXPRESSION[1]">
    		<xsl:for-each select="//MULTI[generate-id() = generate-id(key('client_status',INSTANCE[@name='Client']/ITEM)[1])]">
    			<xsl:sort select="INSTANCE[@name='Client']/ITEM"/>	
    			<xsl:choose>	
    			<xsl:when test="INSTANCE[@name='Status']/ITEM = 'failed'">		
    <xsl:text>
    failed</xsl:text>
    				<xsl:value-of select="INSTANCE[@name='Client']/ITEM"/>
    			</xsl:when>
    				<xsl:otherwise>
    					<xsl:text>
    success</xsl:text>
    					<xsl:value-of select="INSTANCE[@name='Client']/ITEM"/>
    				</xsl:otherwise>
    			</xsl:choose>
    <xsl:text>
     
    </xsl:text>
    		</xsl:for-each>
    	</xsl:template>
    </xsl:stylesheet>
    Car j'ai rien en sortie avec ça!!

Discussions similaires

  1. Est-il possible d'utiliser des fichiers xsl en cascade ?
    Par Faekk dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 22/08/2005, 12h34
  2. choix des clés primaires
    Par dcollart dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 17/08/2005, 17h25
  3. Créer des clés informatiques à partir d'1 base de données??
    Par Flateric dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 11/02/2005, 07h49
  4. Intéret des clés composées ?
    Par romain3395 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 28/06/2004, 14h19
  5. pb avec des clés sur un formulaire
    Par marie253 dans le forum Bases de données
    Réponses: 7
    Dernier message: 17/06/2004, 13h53

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