Bonjour tout le monde,
j'explique le contexte :
je développe actuellement une classe PHP de linéarisation d'un objet vers du xml (et inversement : délinéarisation de l'objet).
J'ai implémenté dans cette classe une méthode permettant d'afficher le xml généré. Pour cela, je passe par XSLT.
Mon problème ne se situe pas au niveau de l'implémentation PHP, mais bien du code XSL.
Dans le flux XML que je génère, je ne connais jamais : ni sa taille, ni le nombre d'éléments, ni les imbrications, ni le nom de éléments d'ailleurs (je reprends le nom des propriétés de l'objet).
Du coup, j'ai besoin d' un XSL parfaitement générique, capable d'afficher le nom des éléments, et d'aller aussi profondément que nécessaire dans les imbrications.
Ma transformation se fait vers du HTML, et plus exactement, une liste : l'élément le plus haut de cette liste étant le nom de l'objet, puis on trouve ses propriétés, et évidemment, si ces propriétés sont des tableaux, on trouve les clefs de ce tableau (qui peut-être multidimensionnel), ses valeurs...une propriété peut-même être un autre objet.
Bref, c'est une arborescence classique.
Voici un exemple de xml :
Voici le XSL associé :
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 <?xml version="1.0" encoding="utf-8"?> <object_ocharacters> <aTestMulti> <bla> <_0>1</_0> <_1>2</_1> <_2>3</_2> </bla> </aTestMulti> <aChars> <strength>23</strength> <dexterity>6</dexterity> <intelligence>3</intelligence> <endurance>8</endurance> <swiftness>7</swiftness> </aChars> <aAttacks> <sword>5</sword> <axe>0</axe> <lance>0</lance> <club>0</club> <hand>0</hand> </aAttacks> <aDefenseWith> <sword>1</sword> <axe>0</axe> <lance>0</lance> <club>0</club> <hand>0</hand> <shield>0</shield> </aDefenseWith> <aDefenseAgainst> <sword>2</sword> <axe>1</axe> <lance>0</lance> <club>5</club> <hand>10</hand> </aDefenseAgainst> <aSpecialAtt> <poison>0</poison> <fire>0</fire> <ice>0</ice> <earth>0</earth> <water>0</water> </aSpecialAtt> <aSpecialDef> <poison>0</poison> <fire>0</fire> <ice>0</ice> <earth>0</earth> <water>0</water> </aSpecialDef> <aSpecialMisc> <autoHeal>0</autoHeal> </aSpecialMisc> <oArmour/> <oWeapon> <object_oweapons> <sImg>img/weapons/default.png</sImg> <sIsA/> <aSpecialAtt> <poison>0</poison> <fire>0</fire> <ice>0</ice> <earth>0</earth> <water>0</water> </aSpecialAtt> <aSpecialDef> <poison>0</poison> <fire>0</fire> <ice>0</ice> <earth>0</earth> <water>0</water> </aSpecialDef> <aDefense> <sword>0</sword> <axe>0</axe> <lance>0</lance> <club>0</club> <hand>0</hand> </aDefense> <sName>Basic Sword</sName> <sType>sword</sType> </object_oweapons> </oWeapon> <oEquipment/> <aWeapons> <_0>Basic Sword</_0> </aWeapons> <aArmours/> <aEquipments/> <PV>0</PV> <XP>0</XP> <sImg>img/avatars/default.png</sImg> </object_ocharacters>
Il y a deux problèmes identifiés :
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 <?xml version ="1.0" encoding ="utf-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" extension-element-prefixes="php"> <xsl:output method="xml" indent="yes" encoding="utf-8" /> <xsl:namespace-alias stylesheet-prefix="php" result-prefix="xsl" /> <xsl:template match="/"> <xsl:call-template name="recursive"/> </xsl:template> <xsl:template name="recursive"> <xsl:for-each select="*"> <ul> <xsl:if test="count(.) != 0"> <li> <xsl:value-of select="local-name (.)"/> <xsl:if test="local-name(*)"> <li> <xsl:value-of select="local-name(*)"/> </li> </xsl:if> <xsl:if test="text()"> => <xsl:value-of select="text()"/> </xsl:if> </li> </xsl:if> <xsl:call-template name="recursive"/> </ul> </xsl:for-each> </xsl:template> </xsl:stylesheet>
- la récursivité est mauvaise, visiblement, puisque la liste générée l'est ausi :-) (cela se voit immédiatement à l'indentation : il y a sans doute des tags non fermés)
- j'affiche 2 fois le 1er élément de chaque imbrication.
J'ai bien identifié les deux problèmes,et le pourquoi de ces problèmes, mais j'ai quelques soucis pour les résoudre, ma logique XSL n'étant pas parfaite.
Merci par avance :-)
Partager