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 :

fonction key variable ? / utilisation de l'index ? / autre solution


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 50
    Par défaut fonction key variable ? / utilisation de l'index ? / autre solution
    Hello à tous !

    Tout d'abord bonne année à tous !

    Alors voilà, j'ai débuté il y a peu le xslt mais ca fait un bon moment que je suis sur le problème et je ne trouve pas la solution... J'espère que vous pourrais m'aider.

    Alors je vous explique le soucis. J'ai un fichier xml à modifier qui est en fait du html. (Je l'ai simplifié pour que ce soit plus compréhensible pour vous)

    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
     
     
    <table class="table_croise">
    <tbody>
    <tr>
    <td class="colonne">
    Francais
    </td>
    <td class="ligne">
    Marie
    </td>
    <td class="donnee">
    10
    </td>
    </tr>
     
    <tr>
    <td class="colonne">
    Francais
    </td>
    <td class="ligne">
    Caroline
    </td>
    <td class="donnee">
    8
    </td>
    </tr>
     
    <tr>
    <td class="colonne">
    Math
    </td>
    <td class="ligne">
    Marie
    </td>
    <td class="donnee">
    8
    </td>
    </tr>
     
    <tr>
    <td class="colonne">
    Math
    </td>
    <td class="ligne">
    Caroline
    </td>
    <td class="donnee">
    7
    </td>
    </tr>
     
    </tbody>
    </table>
    Et en gros ce que je voudrais au final, pour cet exemple est un récapitulatif des notes :
    Francais Math
    Marie 10 8
    Caroline 8 7

    Et ca j'ai reussi à le faire (p-e pas de la manière la plus efficace ) comme ceci :

    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
     
    <?xml version="1.0" encoding="utf-8"?>
     
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
     
     
        <xsl:key name="muench" match="table[@class='table_croise']/tbody/tr/td[@class= 'colonne']" use="."/>
    	<xsl:key name="muench2" match="table[@class='table_croise']/tbody/tr/td[@class= 'ligne']" use="."/>
     
     
        <xsl:template  match="table[@class='table_croise']">
        	<table>
        	<tr>
        	<td>
     
     
     
        	</td>
     
     
        	<xsl:for-each select="tbody/tr/td[@class='colonne'][generate-id() = generate-id(key('muench',.))]">
     
     
     
     
        		<xsl:call-template name="pivotColonne">
        			<xsl:with-param name="colonne" select="."/>
        		</xsl:call-template>
        	</xsl:for-each>
        	<td>
     
        	</td>
        		</tr>
     
     
        	<xsl:apply-templates mode="lignes"  select="tbody/tr/td[@class= 'ligne'][generate-id() = generate-id(key('muench2',.))]"/>  
     
        	</table>
        </xsl:template>
     
     
        <xsl:template name="pivotColonne">
        	<xsl:param name="colonne"/>
     
        		<td>
        			 <xsl:value-of select="$colonne"/>
        		</td>
     
     
     
        </xsl:template>
     
     
     
    	<xsl:template name="lignes" match="tbody/tr/td[@class='ligne']" mode="lignes" >
    	<xsl:variable name="ligne" select="." />
      		<tr>
        			<td>
        			 <xsl:value-of select="."/>
     
     
     
        			</td>
     
        				<xsl:for-each select="ancestor::tbody/tr/td[@class= 'colonne'] [generate-id() = generate-id(key('muench',.))]">
     
        				<xsl:variable name="valCol" select="." />
        				<xsl:for-each select="ancestor::tbody/tr[td = $valCol]">
     
        					<xsl:if test="td[@class= 'ligne'] =  $ligne">
        					<td>
        							<xsl:value-of select="td[@class= 'donnee']"/>
        					</td>
        					</xsl:if>
        				</xsl:for-each>
     
        			</xsl:for-each>
     
     
        	</tr>
    </xsl:template>
     
     
    </xsl:stylesheet>


    Mon soucis se retrouve ici, si j'ai deux fois la même table, cela ne fonctionne plus. :

    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
    <table class="table_croise">
    <tbody>
    <tr>
    <td class="colonne">
    Francais
    </td>
    <td class="ligne">
    Marie
    </td>
    <td class="donnee">
    10
    </td>
    </tr>
     
    <tr>
    <td class="colonne">
    Francais
    </td>
    <td class="ligne">
    Caroline
    </td>
    <td class="donnee">
    8
    </td>
    </tr>
     
    <tr>
    <td class="colonne">
    Math
    </td>
    <td class="ligne">
    Marie
    </td>
    <td class="donnee">
    8
    </td>
    </tr>
     
    <tr>
    <td class="colonne">
    Math
    </td>
    <td class="ligne">
    Caroline
    </td>
    <td class="donnee">
    7
    </td>
    </tr>
     
    </tbody>
    </table>
    <table class="table_croise">
    <tbody>
    <tr>
    <td class="colonne">
    Francais
    </td>
    <td class="ligne">
    Marie
    </td>
    <td class="donnee">
    10
    </td>
    </tr>
     
    <tr>
    <td class="colonne">
    Francais
    </td>
    <td class="ligne">
    Caroline
    </td>
    <td class="donnee">
    8
    </td>
    </tr>
     
    <tr>
    <td class="colonne">
    Math
    </td>
    <td class="ligne">
    Marie
    </td>
    <td class="donnee">
    8
    </td>
    </tr>
     
    <tr>
    <td class="colonne">
    Math
    </td>
    <td class="ligne">
    Caroline
    </td>
    <td class="donnee">
    7
    </td>
    </tr>
     
    </tbody>
    </table>
    Ce qui me parait logique puisque le genererate-id(key()) va toujours rechercher la premiere correspondance et du coup ca fonctionne pour le premier tableau. Mais plus pour le suivant. Mais je ne vois pas trop de solution.

    Je ne pense pas qu'il soit possible de varier la clé ? peut-être jouer sur l'index de la key quand je genere l'id... Mais je ne trouve pas la solution...

    Voilà, j'espère que mon problème est compréhensible.
    Je vous remercie d'avance de votre aide.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 50
    Par défaut
    Hello,

    je relance le sujet car je suis toujours bloqué...

    Qu'est-ce qui bloque ? Mon problème n'est pas compréhensible ? Je me suis mal exprimé ?
    j'avoue je commence un peu à désespérer

  3. #3
    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
    C'est juste que c'est un exemple un peu trop compliqué pour un début.

    En gros quand tu avais un seul tableau, les index de tes clés, c'était le nom de a matière et le nom de l'élève.
    Maintenant c'est des couples : (tableau, nom de la matière) et (tableau, nom de l'élève)

    Et le problème reste d'identifier deux tableaux différents. Tu peux le faire avec leur generate-id().
    reste donc à utiliser un couple de strings au lieu d'une seule string. Ça peut se faire en concaténant les deux et en les séparant par une virgule (il n'y a pas de virgule dans un generate-id())

    Ça donne quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:key name="muench" match="machin" use="concat(generate-id(ancestor::table), ';', .)"/>
    Naturellement, XSLT 2.0 et son for-each-group simplifie tout ça de beaucoup.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 50
    Par défaut
    Un grand merci ! je vais tenter

    je tiens au courant

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/02/2009, 12h09
  2. [MySQL] Problème de syntaxe avec variable utilisée dans fonction PHP et MySQL
    Par redvivi dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 19/03/2008, 21h07
  3. Réponses: 4
    Dernier message: 03/08/2007, 07h35
  4. utiliser une variable se trouvant dans un autre .c
    Par richard_sraing dans le forum C
    Réponses: 2
    Dernier message: 18/03/2006, 11h59
  5. Valeur d'e variable d'une fct dans autre fonction
    Par Torpedox dans le forum Langage
    Réponses: 3
    Dernier message: 11/11/2005, 08h48

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