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

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    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 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    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.

  3. #3
    Expert confirmé
    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
    Points : 4 843
    Points
    4 843
    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 à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    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
    Expert confirmé
    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
    Points : 4 843
    Points
    4 843
    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 à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    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 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    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 -_-°.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    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!!

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Enfait la raison pour laquelle çe ne me convient pas la solution de loceka finalement, c'est que ma machine éxcutant le processing, je n'obtiens rien en ouput. Je suis en php5-xsl 5.2 sur cette machine. Lorsque que j'essai en local avec un xsl-php 5.3.3 cela fonctionne ! C'est la seule différence observable et je ne vois d'ou vient ce problème!

    Pensez vous que cela a un incident? J'ai cherché sur le net et apparement il y aurait des pb similaires concernant une différence de la fonction generateid selon les versions.

    Alors peut etre qu'une solution avec moins de generate de partout pourrait résoudre ce problème , à s'arracher les cheveux
    merci

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Tu dois chercher si un des hostnames de ce nom a le status failed.

    - le for-each devrait être plus simple, il n'y a pas besoin de remonter à la racine comme ça.

    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:when test="../MULTI[INSTANCE[@name='Client']/ITEM = $currentHostname and INSTANCE[@name = 'Status']/ITEM = 'failed']">
    "existe-t-il un MULTI de même hostname et de status failed ?"

  11. #11
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    oui ça peut faire parti des cas. Je ne vois pas très bien ou tu veux placer ta ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <xsl:when test="../MULTI[INSTANCE[@name='Client']/ITEM = $currentHostname and INSTANCE[@name = 'Status']/ITEM = 'failed']">

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Pour vérifier s'il existe un MULTI de même hostname et de status failed.
    Autrement dit, pour vérifier s'il faut afficher 'failed' pour ce hostname.

  13. #13
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    il peut y avoir ce cas, mais dans cas je souhaite n'afficher qu'une fois le couplet hostname + failed. Comme je l'ai indiqué dans le premier post. Sinon quand penses tu de mon post concernant les versions de php5-xsl, d'aujourd'hui dans ce thread?

  14. #14
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par a-dawg Voir le message
    il peut y avoir ce cas, mais dans cas je souhaite n'afficher qu'une fois le couplet hostname + failed. Comme je l'ai indiqué dans le premier post.
    ...
    Et si tu te contentais :
    - de comprendre ce que tu avais fait jusqu'à maintenant avec les codes précédents
    - de comprendre ce que fait le XPath que je te montre (à la limite, même pas besoin : je te l'ai dit, ce que ça fait.)
    - d'essayer ?

    Citation Envoyé par a-dawg Voir le message
    Sinon quand penses tu de mon post concernant les versions de php5-xsl, d'aujourd'hui dans ce thread?
    Rien. PHP connais pas. Il est possible que certaines versions du moteur XSLT de PHP ne sachent pas gérer le <output method="text">, vu que XSLT est plus largement utilisé pour faire du HTML ou du XML.

  15. #15
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Effectivement thelvin cela fonctionne très bien aussi!

    Mais j'ai toujours ce problème sur mon fameux serveur qui ne process pas, output = vide et j'aimerais bien connatire l'oirigine

    meric

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