bonsoir

je debute en xml et je voudrais convertir un document xml suivant le schema de sa nouvelle dtd, et evidement je n'ai pas tout compris....
avant tout 2 questions:
soit le document xml :

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
 
<FILMS>
<film>
..
<realisateur id="r1">
<nom>nom1</nom>
</prenom>prenom1</prenom>
</realisateur>
..
<acteurs>
<acteur id="a1">
<nom>nom1</nom>
</prenom>prenom1</prenom>
</acteur>
...
</acteurs>
</film>
 
<film>
</film>
...
</FILMS>
pour eviter les redondances, on a cree un nouvel element :personne avec un attr ID et on a rajouter des references IDREF vers cet ID aux elements realisateur et acteur

pour l'ensemble des films on veut eviter les doublons, on devrait obtenir le fichier final suivant:

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
 
<FILMS>
<film>
..
<realisateur ref="r1"/>
<personne id="r1">
<nom>nom1</nom>
</prenom>prenom1</prenom>
</personne>
..
<acteurs>
<acteur ref="r1">
...
</acteurs>
</film>
 
<film>
</film>
...
</FILMS>
avec le code suivant j'obtient :

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
 
<xsl:template match="/FILMS">
<xsl:element name="FILMS">
	<xsl:apply-templates select="Film" />
</xsl:element>
 
</xsl:template>
 
<xsl:template match="Film">
	<xsl:element name="Film">
		<xsl:for-each select="Realisateur">
			<xsl:element name="Realisateur">
				<xsl:attribute name="ref"><xsl:value-of select="@ID" /></xsl:attribute>
				<xsl:element name="Personne">
					<xsl:attribute name="ID"><xsl:value-of select="@ID" /></xsl:attribute>
						<xsl:element name="Nom">
							<xsl:value-of select="Nom" />
						</xsl:element>
						<xsl:element name="Prenom">
							<xsl:value-of select="Prenom" />
						</xsl:element>
				</xsl:element>
			</xsl:element>
		</xsl:for-each>
 
		<xsl:element name="Acteurs">
		<xsl:for-each select="./Acteurs/Acteur">
			<xsl:choose> 
				<xsl:when test=".[not (.= preceding::Realisateur)]">
					<xsl:element name="Acteur">
						<xsl:attribute name="ref"><xsl:value-of select="@ID" /></xsl:attribute>
						<xsl:element name="Personne">
							<xsl:attribute name="ID"><xsl:value-of select="@ID" /></xsl:attribute>
								<xsl:element name="Nom">
									<xsl:value-of select="Nom" />
								</xsl:element>
								<xsl:element name="Prenom">
									<xsl:value-of select="Prenom" />
								</xsl:element>
						</xsl:element>
					</xsl:element>
				</xsl:when>
				<xsl:otherwise>
					<xsl:element name="Acteur">
						<xsl:attribute name="ref"><xsl:value-of select="./preceding::Realisateur/@ID" /></xsl:attribute>
					</xsl:element>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:for-each>
		</xsl:element>
 
	</xsl:element>
 
</xsl:template>
pour un seul realisateur qui est aussi acteur ca marche j'obtiens bien

<realisateur ref="r1"/>
et
<acteur ref="r1">
qui pointe vers la bonne personne créée une seule fois
<personne id="r1">
<nom>nom1</nom>
</prenom>prenom1</prenom>
</personne>

mais lorsque j'ai 2 realisateurs qui jouent egalement j'obtiens
<realisateur ref="r1"/>
et
<personne id="r1">
<nom>nom1</nom>
</prenom>prenom1</prenom>
</personne>
jusque la ok
mais la...
<acteur ref="r1 r2">
ca ne va pas...les attributs d'origine ID se cumulent dans ref...

qqu'un a une idee ?
merci d'avance
n