Précédent   Forum du club des développeurs et IT Pro > Autres langages > XML/XSL et SOAP > XSL/XSLT/XPATH
XSL/XSLT/XPATH XPath, XSLT, XSL-FO et tout ce qui permet de les mettre en oeuvre . Avant de poster -> FAQ XML, Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 02/01/2013, 20h32   #1
eleve_prog
Membre à l'essai
 
Homme Felicien
Inscription : février 2011
Messages : 50
Détails du profil
Informations personnelles :
Nom : Homme Felicien
Localisation : Belgique

Informations forums :
Inscription : février 2011
Messages : 50
Points : 24
Points : 24
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 :
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 :
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 :
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.
eleve_prog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2013, 17h31   #2
eleve_prog
Membre à l'essai
 
Homme Felicien
Inscription : février 2011
Messages : 50
Détails du profil
Informations personnelles :
Nom : Homme Felicien
Localisation : Belgique

Informations forums :
Inscription : février 2011
Messages : 50
Points : 24
Points : 24
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
eleve_prog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2013, 18h13   #3
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 121
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 121
Points : 10 358
Points : 10 358
Envoyer un message via Skype™ à thelvin
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 :
<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.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
Partagez vos connaissances, mais aussi comment s'en servir.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2013, 13h50   #4
eleve_prog
Membre à l'essai
 
Homme Felicien
Inscription : février 2011
Messages : 50
Détails du profil
Informations personnelles :
Nom : Homme Felicien
Localisation : Belgique

Informations forums :
Inscription : février 2011
Messages : 50
Points : 24
Points : 24
Un grand merci ! je vais tenter

je tiens au courant
eleve_prog est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h20.


 
 
 
 
Partenaires

Hébergement Web