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 :
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
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 l'ensemble des films on veut eviter les doublons, on devrait obtenir le fichier final suivant:
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 <FILMS> <film> .. <realisateur ref="r1"/> <personne id="r1"> <nom>nom1</nom> </prenom>prenom1</prenom> </personne> .. <acteurs> <acteur ref="r1"> ... </acteurs> </film> <film> </film> ... </FILMS>
pour un seul realisateur qui est aussi acteur ca marche j'obtiens bien
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>
<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
Partager