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 :

[XSLT] Distinct


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Par défaut [XSLT] Distinct
    Bonjour,

    ce topic est surement 1000 fois dans le forum mais impossible d'appliquer à mon cas (pourtant pas très complexe)

    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
     
    <Report>
     <tables>
      <table tableshort='MA' recid='9105'>
       <field fieldno="93"></field>
       <field fieldno="0">20070822</field>
       <field fieldno="37"></field>
      </table>
        <table tableshort='MA' recid='12242'>
       <field fieldno="93">ANDRIEU Jean-Marc</field>
       <field fieldno="0">20071120</field>
       <field fieldno="37"></field>
      </table>
      <table tableshort='MA' recid='12243'>
       <field fieldno="93">ANDRIEU Jean-Marc</field>
       <field fieldno="0">20071121</field>
       <field fieldno="37"></field>
      </table>
      <table tableshort='MA' recid='12244'>
       <field fieldno="93">ANDRIEU Jean-Marc</field>
       <field fieldno="0">20071120</field>
       <field fieldno="37"></field>
      </table>
      <table tableshort='MA' recid='10443'>
       <field fieldno="93">ANDRIEU Jean-Marc</field>
       <field fieldno="0">20071003</field>
       <field fieldno="37"></field>
      </table>
      <table tableshort='MA' recid='9330'>
       <field fieldno="93">ANDRIEU Jean-Marc</field>
       <field fieldno="0">20070831</field>
       <field fieldno="37"></field>
      </table>
      <table tableshort='MA' recid='12378'>
       <field fieldno="93">ANDRIEU Jean-Marc</field>
       <field fieldno="0">20071121</field>
       <field fieldno="37"></field>
      </table>
      <table tableshort='MA' recid='10212'>
       <field fieldno="93">BOUREZ Jérôme</field>
       <field fieldno="0">20070926</field>
       <field fieldno="37"></field>
      </table>
      <table tableshort='MA' recid='10213'>
       <field fieldno="93">BOUREZ Jérôme</field>
       <field fieldno="0">20070925</field>
       <field fieldno="37"></field>
      </table>
      <table tableshort='MA' recid='9264'>
       <field fieldno="93">BOUREZ Jérôme</field>
       <field fieldno="0">20070831</field>
       <field fieldno="37"></field>
      </table>
    </tables>
    </Report>
    Ce à quoi je dois arriver est un comptage du nombre d'occurences par employé et par mois

    J'ai dans un premier temps essayé de distingué chaque numéro de mois de mon fichier xml (pour ensuite passer aux personnes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <xsl:for-each select="/report/tables/table[not(substring(field[@fieldno=0],5,2) = substring(preceding-sibling::table/field[@fieldno=0],5,2))]">
               <xsl:sort select="substring(field[@fieldno=0],5,2)" data-type="text" order="ascending"/>
           <tr>
            <td>
             <xsl:value-of select="substring(field[@fieldno=0],5,2)"/>
            </td>
           </tr>
       </xsl:for-each>
    Mais ça ne me fait pas du tout de distinct, j'obtiens tous les mois, classé par ordre, mais j'ai autant de lignes que dans mon fichier xml de départ...

    J'espère ne pas m'être mal exprimé

    PS: pour l'instant j'utilise une méthode + algorithmique (je regarde la valeur à position()-1, si c'est égal, je n'écris pas. Mais c'est très long pour un gros fichier xml

    Merci de votre aide !
    a+
    juva

  2. #2
    Membre éclairé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Par défaut
    Alors j'ai avancé un tout petit peu

    J'arrive en effet à enlever les doublons sur l'élément date (sans problème)
    mais pas sur le mois: substring(madate,5,2)

    mon code "actuel":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
             <xsl:for-each select="/report/tables/table[not(field[@fieldno=0]=preceding-sibling::table/field[@fieldno=0])]">
                 <xsl:sort select="field[@fieldno=0]" data-type="text" order="ascending"/>
               <tr>
                <td>
                  <xsl:value-of select="field[@fieldno=0]"/>
                </td>
               </tr>
          </xsl:for-each>

  3. #3
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    cela peut être fait en utilisant la méthode Muench (tu trouveras de nombreuses références à cette méthode dans la FAQ et dans le forum) :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
        <xsl:key name="employes" match="field[@fieldno = '93']" use="."/>
        <xsl:key name="mois" match="field[@fieldno = '0']" use="concat(../field[@fieldno = '93'], substring(., 5, 2))"/>
        <xsl:template match="/Report">
            <Report>
                <xsl:for-each select="tables/table/field[@fieldno = '93' and generate-id() = generate-id(key('employes', .)[1])]">
                    <xsl:variable name="nom-employe" select="."/>
                    <employe name="{$nom-employe}">
                        <xsl:for-each select="key('employes', $nom-employe)/../field[@fieldno = '0' and generate-id() = generate-id(key('mois', concat($nom-employe, substring(., 5, 2)))[1])]">
                            <xsl:variable name="mois" select="substring(., 5, 2)"/>
                            <nb-occurrences mois="{$mois}"><xsl:value-of select="count(key('mois', concat($nom-employe, $mois)))"/></nb-occurrences>
                        </xsl:for-each>
                    </employe>
                </xsl:for-each>
            </Report>
        </xsl:template>
    </xsl:stylesheet>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Membre éclairé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Par défaut
    Merci beaucoup GrandFather !
    ça fonctionne

    il me reste cependant un problème
    dans mes instruction xsl:key j'aimerais utiliser des paramètres de ma feuille
    j'ai un message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:key name="mois" match="field[@fieldno = '0']" use="concat(../field[@fieldno=$numFieldRef], substring(., 5, 2))"/>
    remplacer le '93' par $numFieldRef
    numFieldRef est un param de ma stylesheet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:param name='numFieldRef' select='93' />
    quand je l'utilise dans une autre instruction ça fonctionne
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="/report/tables/table/field[@fieldno =$numFieldRef and generate-id() = generate-id(key('employes', .)[1])]">
    une idée peut être ?

    PS; j'utilise cooktop pour mes tests. Le message d'erreur qu'il me ressort est:
    Citation Envoyé par cooktop
    ERROR: Description: Variables may not be used within this expression.

    field[@fieldno = -->$numFieldRef<--]
    Merci de ton aide encore !

    A bientot
    juvamine

  5. #5
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    L'utilisation des variables dans les définitions de clé des noeuds n'est effectivement pas autorisée, pour éviter les effets de bord.

    Il n'est pas trop difficile de modifier le code pour y ajouter ce paramètre, par contre cela dépend s'il est le seul ou non.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Membre éclairé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Par défaut
    Citation Envoyé par GrandFather Voir le message
    L'utilisation des variables dans les définitions de clé des noeuds n'est effectivement pas autorisée, pour éviter les effets de bord.

    Il n'est pas trop difficile de modifier le code pour y ajouter ce paramètre, par contre cela dépend s'il est le seul ou non.
    c'est bien ce que j'avais cru comprendre en faite j'ai deux paramètres de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         <xsl:param name='numFieldRef' select='93' />
     
         <xsl:param name='numFieldDate' select='0' />
    mon champs de référence à "compter"
    le champs contenant la date

    mon code à l'heure actuelle:

    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
     
    <xsl:key name="employes" match="field[@fieldno=93]" use="."/> 
       <xsl:key name="mois" match="field[@fieldno =0]" use="concat(../field[@fieldno =93], substring(., 5, 2))"/>
       <xsl:template name="makeTable">
         <table cellspacing="10" border ="1">
     
       <xsl:for-each select="/report/tables/table/field[@fieldno = $numFieldRef and generate-id() = generate-id(key('employes', .)[1])]">
        <xsl:variable name="nom-employe" select="."/>
        <tr>
         <td><xsl:value-of select="$nom-employe"/></td>
         <xsl:for-each select="/report/tables/table/field[@fieldno=$numFieldDate and generate-id() = generate-id(key('nomois',substring(.,5,2))[1])]">
          <xsl:sort select="substring(., 5, 2)" />
          <xsl:variable name="mois" select="substring(., 5, 2)"/>
          <td><xsl:value-of select="count(key('mois', concat($nom-employe, $mois)))"/></td>
         </xsl:for-each>     
         <td><xsl:value-of select="count(key('employes', $nom-employe))"/></td>
        </tr>
       </xsl:for-each>
     
      </table>
     
       </xsl:template>
    si vraiment je veux les garder je dois utiliser autre chose que la méthode Muench ??
    Sinon comment faire ?

    Merci d'avance

Discussions similaires

  1. [xslt 1.0] - distinct value sur un attribut
    Par jacquesh dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 30/10/2007, 07h38
  2. [XSLT] Sélectionner des valeurs distinctes
    Par vavanounet dans le forum XSL/XSLT/XPATH
    Réponses: 12
    Dernier message: 14/05/2007, 12h43
  3. [XSLT] compte et affichage des noeuds distincts
    Par xoubidur dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 31/01/2007, 12h08
  4. [Documentation][XSLT][XSLFO]Les balises xslfo
    Par Lydiane dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 14/08/2002, 11h31
  5. [XSLT]position d'un element de valeur specifique
    Par squat dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 25/07/2002, 16h42

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