Bonjour,
je débute en XSLT et en Xpath (1.0)
je n'arrive pas à récupérer le numéro d'ordre d'une occurrence d'élément dans un fichier XML.
Attention, ce n'est pas la position du noeud dans l'arbre que je cherche, car elle est la même pour toutes less occurrences de ce noeud quand j'appelle la fonction position()
Question
Y a t-il un moyen de récupérer la place de l'occurrence d'un noeud ?
EXPLICATION : il s'agit de parcourir un fichier XML et de le recopier dans un autre en changeant TOUTES les valeurs d'un des éléments
Ex si j'ai dans mon DOCUMENT1 un élément <textSynth> avec 3 occurrences comportant chacune une valeur différente, et dans mon DOCUMENT2 un autre élément <text> avec aussi 3 occurrences, je souhaite obtenir un DOCUMENT3 où j'aurai mis une à une les valeurs de DOCUMENT1/<textSynt> dans DOCUMENT2/<text>.
Pour cela, il me faut bien accéder à chaque occurrence et pas à la position dans l'arbre seulement, non ?
Merci de votre aide
Voici mon document1
Voici mon document 2
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 <?xml version="1.0" encoding="ISO-8859-1"?> <SUJET> <made-by>LisaMotion</made-by> <numSuj>03</numSuj> <titreSequ>Martine à la plage</titreSequ> <rubrique></rubrique> <synthe> <numSynth>01</numSynth> <Macro_typeSynth>I</Macro_typeSynth> <nbLignes>3</nbLignes> <textSynth>justice</textSynth> <textSynth>hier</textSynth> <textSynth>Archives</textSynth> <TC_IN></TC_IN> <TC_OUT></TC_OUT> </synthe> </SUJET>
voici ma feuille XSL (1.0) en mode debug
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 <?xml version="1.0" encoding="UTF-8"?> <ozml version="3.0"> <factory id="1" uuid="044beba5ad3211d7ac9b000393833f6a"> <description>Style</description> <manufacturer>Apple</manufacturer> <version>1</version> </factory> <factory id="2" uuid="0a5c0b1d4acd11d8b650000a95a6b5a8"> <description>Channel</description> <manufacturer>Apple</manufacturer> <version>1</version> </factory> <scene> <sceneSettings> <width>720</width> <height>576</height> </sceneSettings> <layer name="REPERES Info 2008" id="1282331"> <scenenode name="REPERES " id="1478867" factoryID="9" version="3"> <validTracks>0</validTracks> </scenenode> </layer> <layer name="TITRAGE" id="1274867"> <layer> <scenenode name="Lieu1" id="1283001" factoryID="14" version="3"> <style name="Style " id="1283004" factoryID="1"> <font type="0">HeldustryFTV-Demi</font> </style> <styleRun style="1283004" offset="0" length="8" /> <text>premier texte Ã* insérer</text> <object value="112"> <parameter name="Crénage" id="1" flags="16" value="0" /> </object> <object value="114"> <parameter name="Crénage" id="2" flags="16" value="0" /> </object> </scenenode> <scenenode name="Lieu2" id="1283002" factoryID="14" version="3"> <style name="Style " id="1283004" factoryID="1"> <font type="0">HeldustryFTV-Demi</font> </style> <styleRun style="1283004" offset="0" length="8" /> <text>deuxième texte Ã* insérer</text> <object value="112"> <parameter name="Crénage" id="1" flags="16" value="0" /> </object> <object value="114"> <parameter name="Crénage" id="2" flags="16" value="0" /> </object> </scenenode> <scenenode name="Lieu3" id="1283003" factoryID="14" version="3"> <style name="Style " id="1283004" factoryID="1"> <font type="0">HeldustryFTV-Demi</font> </style> <styleRun style="1283004" offset="0" length="8" /> <text>troisième texte Ã* insérer</text> <object value="112"> <parameter name="Crénage" id="1" flags="16" value="0" /> </object> <object value="114"> <parameter name="Crénage" id="2" flags="16" value="0" /> </object> </scenenode> </layer> </layer> </scene> </ozml>
Merci
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 <?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version="1.0"> <xsl:output method="xml" encoding="ISO-8859-1" indent="yes" doctype="ozxmlscene" /> <!-- Copie du document 2 dans un nouveau document 3 --> <xsl:template match="*|@*"> <xsl:copy> <xsl:copy-of select="@*"/> debug_position_<xsl:value-of select="name()"/> : <xsl:value-of select="position()"/> : <xsl:apply-templates/> </xsl:copy> </xsl:template> <!-- cas particulier de l'element <text> du document 2 --> <xsl:template match="/ozml/scene/layer/layer/scenenode/text"> debug_position_courante_<xsl:value-of select="name()"/> : <xsl:value-of select="position()"/> <xsl:value-of select="/ozml/scene/layer/layer/scenenode/text[position()]"/> <xsl:call-template name="insertion"> <xsl:with-param name="compteur" select="1"/> </xsl:call-template> </xsl:template> <!-- on recopie chaque occurence du noeud <textSynth> du document 1 dans l'occurence correspondante du noeud <text> du document 3 --> <xsl:template name="insertion" > <xsl:param name="compteur"/> debug_compteur : <xsl:value-of select="$compteur"/> <xsl:element name="text"> <xsl:value-of select="document('document1.xml')/SUJET/synthe/textSynth[$compteur]/text()" /> </xsl:element> <xsl:if test="$compteur < last()"> <xsl:call-template name="insertion"> <xsl:with-param name="compteur" select="$compteur+1"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
Partager