[XSLT] regroupement et identifiant
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:
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:
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:
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