Bonjour,
Je cherche à faire une liste d'attributs vides. J'arrive à parcourir et à afficher mais je n'arrive pas à créer un compteur qui me permet de connaitre le nombre exacte d'attributs vide.
Merci.
Bonjour,
Je cherche à faire une liste d'attributs vides. J'arrive à parcourir et à afficher mais je n'arrive pas à créer un compteur qui me permet de connaitre le nombre exacte d'attributs vide.
Merci.
Non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part count(//@*[. = ''])
Je corse un peu la question. Je vais essayer de produire un peu de code de mon côté, mais si quelqu'un trouve avant, il sera le champion !
Supposons des attributs vides. Il y en aurait au moins 2, qui seraient présents 1 fois ou plus.
Maintenant nous aimerions établir la liste de ces attributs, avec le nombre d'occurrences entre parenthèses. Nous ne voulons pas de doublons dans cette liste. Ainsi, je n'aurais par exemple qu'une seule ligne mentionnant l'attribut "id".
Petit exemple du résultat attendu :
Je viens de me poser la question, donc je n'ai ni code source, ni proposition, mais je vais réfléchir là-dessus, je trouve le sujet intéressant... Enfin je crois. Non ?!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Voici la liste des attributs vides : - @id (234) - @type (117) - @style (8)
- Muench pour avoir la liste dédupliquée des noms d'attributs vides
- pour chaque attribut, pour obtenir son nombre, count() sur la clé.
Quelque chose comme
À noter que vu que je n'utilise que name() et pas namespace-uri(), il peut possiblement y avoir confusion dans les namespaces. Une solution possible serait d'avoir concat( namespace-uri(), '|', local-name() ) comme use.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <xsl:key name="empty-attrs" match="@*[. = '']" use="name()"/> <xsl:template match="/"> <xsl:for-each select="//@*[. = '' and generate-id(.) = generate-id(key('empty-attrs', name()))]"> <xsl:value-of select="concat('@', name(), ' (', count(key('empty-attrs', name())), ')')"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template>
Permettons-nous ce matin une interjection : Purée !
J'étais bloqué sur le count... j'ai pas pensé un seul instant à réutiliser la clé... n'importe quoi.
En tout cas c'est super sympa d'avoir répondu à la question subsidiaire !
J'ai parlé trop vite :
J'ai soudainement prix peur, pensant que le problème serait insoluble... Mais finalement il ne manquait qu'une bricole, un petit [1] pour dire que l'on ne veut qu'une seule fois l'item détecté (on n'a pas besoin de tous les détecter, juste le premier ; pour compter par contre, il nous les faut tous).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Description: A sequence of more than one item is not allowed as the first argument of generate-id() (@id, @id, ...) Emplacement de début: 12:0 URL: http://www.w3.org/TR/xpath20/#ERRXPTY0004
Voici donc ce que je propose (en fait la même chose quasiment) :
Le petit fichier XML que j'ai utilisé (fait vite fait à la mano, à partir du contenu d'un ePub) :
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 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output encoding="UTF-8" method="text"/> <xsl:key name="empty-attrs" match="//@*[. = '']" use="name()"/> <xsl:template match="/"> <xsl:text>VOICI LA LISTE DES ELEMENTS VIDES :</xsl:text> <xsl:for-each select="//@*[. = '' and generate-id(.) = generate-id(key('empty-attrs', name())[1])]"> <xsl:text> </xsl:text> <xsl:value-of select="concat('@', name(), ' (', count(key('empty-attrs', name())), ')')"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Et le résultat, très très simplissime :
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 <?xml version="1.0" encoding="UTF-8"?> <folder> <file type="" id="">content.opf</file> <file id="">Fonts</file> <file id="">Images</file> <file id="">Styles</file> <file id="">Text</file> <file id="">toc.ncx</file> <file id="">12AB668D.jpg</file> <file id="">18EE4028.jpg</file> <file id="">1B20E28.jpg</file> <file id="">22869CD4.jpg</file> <file id="">2C1D56A9.jpg</file> <file id="">30B650F0.jpg</file> <file id="">31ED74E2.jpg</file> <file id="">3311B921.jpg</file> <file id="">33722800.jpg</file> <file id="">344D205C.jpg</file> <file id="">3495126B.jpg</file> <file id="">371430D3.jpg</file> <file id="">41C47B98.jpg</file> <file id="">49BF2043.jpg</file> <file id="">4B3A6B3D.jpg</file> <file id="">5049F7CA.jpg</file> <file id="">51BB7717.jpg</file> <file id="">534B8A4C.jpg</file> <file id="">5465227C.jpg</file> <file id="">57AD8053.jpg</file> <file id="">57F4D43F.jpg</file> <file id="">5A5E9811.jpg</file> <file id="">5F6748AD.jpg</file> <file id="">6A173560.jpg</file> <file id="">6A173561.jpg</file> <file id="">6A173562.jpg</file> <file id="">6A173563.jpg</file> <file id="">6A173564.jpg</file> <file id="">6A173565.jpg</file> <file id="">6A173566.jpg</file> <file id="">6A173567.jpg</file> <file id="">6A17356E.jpg</file> <file id="">6CC53C10.jpg</file> <file id="">730748BE.jpg</file> <file id="">76A38FE4.jpg</file> <file id="">771E2ED9.jpg</file> <file id="">77CF6BCC.jpg</file> <file id="">79595AF5.jpg</file> <file id="">7BE5BE9E.jpg</file> <file id="">7BE5BEA2.jpg</file> <file id="">7BE5BEA3.jpg</file> <file id="">7BE5BEA4.jpg</file> <file id="">7BE5BEA5.jpg</file> <file id="">7BE5BEA6.jpg</file> <file id="">7BE5BEAC.jpg</file> <file id="">7BE5BEAD.jpg</file> <file id="">7BE5BEAE.jpg</file> <file id="">81A137DD.jpg</file> <file id="">81EB3EE3.jpg</file> <file id="">82F7C098.jpg</file> <file id="">8857BCE9.jpg</file> <file id="">899131C3.jpg</file> <file id="">8BBE7923.jpg</file> <file id="">8BED6169.jpg</file> <file id="">8C965D26.jpg</file> <file id="">8C965D27.jpg</file> <file id="">8C965D28.jpg</file> <file id="">8C965D29.jpg</file> <file id="">8C965D2A.jpg</file> <file id="">8C965D2B.jpg</file> <file id="">8C965D2F.jpg</file> <file id="">8C965D38.jpg</file> <file id="">8C965D3B.jpg</file> <file id="">90BF587C.jpg</file> <file id="">90E91682.jpg</file> <file id="">93AC4F6C.jpg</file> <file id="">9A51A4A2.jpg</file> <file id="">9AFE75CD.jpg</file> <file id="">9E4A72AD.jpg</file> <file id="">9E977268.jpg</file> <file id="">A153C2A0.jpg</file> <file id="">A1FBB1BC.jpg</file> <file id="">A3CDFEFD.jpg</file> <file id="">A671A7FA.jpg</file> <file id="">A7674855.jpg</file> <file id="">A7674856.jpg</file> <file id="">A7674857.jpg</file> <file id="">A7674859.jpg</file> <file id="">A767485A.jpg</file> <file id="">A767485B.jpg</file> <file id="">A767485E.jpg</file> <file id="">A767485F.jpg</file> <file id="">A7674869.jpg</file> <file id="">A8550FE4.jpg</file> <file id="">A9384B12.jpg</file> <file id="">AB5A3B4D.jpg</file> <file id="">AD7451DD.jpg</file> <file id="">ADCFF440.jpg</file> <file id="">B41B7EE8.jpg</file> <file id="">B4466130.jpg</file> <file id="">B76538D8.jpg</file> <file id="">B76538D9.jpg</file> <file id="">B76538DA.jpg</file> <file id="">B76538DB.jpg</file> <file id="">B76538DE.jpg</file> <file id="">B76538E6.jpg</file> <file id="">B76538E8.jpg</file> <file id="">B76538E9.jpg</file> <file id="">B76538EA.jpg</file> <file id="">BCE8C52A.jpg</file> <file id="">BE633A30.jpg</file> <file id="">C82630FC.jpg</file> <file id="">C8B88209.jpg</file> <file id="">C9607125.jpg</file> <file id="">CA9BE9F3.jpg</file> <file id="">CDA11558.jpg</file> <file id="">CF1B959A.jpg</file> <file id="">cover.jpg</file> <file id="">D8F31AC1.jpg</file> <file id="">DA3B24F1.jpg</file> <file id="">DA964185.jpg</file> <file id="">DF2F9F39.jpg</file> <file id="">E8348D21.jpg</file> <file id="">E9CEC35D.jpg</file> <file id="">F045304D.jpg</file> <file id="">F2FE64A4.jpg</file> <file id="">FF2BD6BD.jpg</file> <file id="">FF5754D5.jpg</file></folder>
Je pense que ça va me servir (pour des petits logs), donc encore merci thelvin
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 VOICI LA LISTE DES ELEMENTS VIDES : @type (1) @id (124)
Si tu fais du XSLT 2.0, il y a bien plus simple qu'un Muench : for-each-group est là pour ça.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <xsl:for-each-group select="//@*[. = '']" group-by="name()"> <xsl:value-of select="concat('@', current-grouping-key())"/> <xsl:text> (</xsl:text> <xsl:value-of select="count(current-group())"/> <xsl:text>) </xsl:text> </xsl:for-each-group>
Oserai-je ? .......................................................................
Pour être honnête, j'ai créé une XSLT par défaut dans oxygen/, qui met automatiquement la version XSLT 2.0 ...
Mais cette inattention a provoqué l'arrivée d'un autre bout de code, donc bénissons le hasard qui fait bien les choses !
J'avoue ne pas trop connaître le 2.0 (à part quelques bricoles), mais si on a ce genre de choses, alors je vais certainement lire de-ci de-là quelques informations...
Je disais ça parce que generate-id() ne fait pas d'erreur si on ne met pas le [1] en XSLT 1.0.
Ceci étant parce qu'en XSLT/XPath 1.0 la notion de séquence n'existe pas. La seule notion d'ensemble c'est les ensembles de nœuds, et generate-id() prend le premier.
Et donc la leçon du jour les enfants : faites attention à votre version XSLT.
On a donc 3 codes pour le prix d'une question si je comprend bien (le mien étant un hybride à ne pas suivre).
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager