Bonjour à tous,

Avant de vous exposer mon problème, voici un échantillon de mon fichier :

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
<DICTIONNAIRE departement="Aisne" dep="02">
 
    <article id="DT02-00001" pg="1">
        <vedette>
            <pg>1</pg>
            <sm>Abancourt,</sm>
        </vedette>
        <definition>
            <typologie>fief</typologie>, <localisation>commune de <commune precision="certain">Brenelle</commune>
            </localisation>*; <typologie>vassal</typologie> de <localisation>Pontarcy</localisation>.
        </definition>
    </article>
 
    <article type="commune" id="DT02-00830" pg="39">
        <vedette>
            <sm>Brenelle,</sm>
        </vedette>
        <definition>
            <localisation>canton de Braine</localisation>.
        </definition>
        <insee>02120</insee>
    </article>
 
    <article id="DT02-00003" pg="1">
        <vedette>
            <sm>Abbaye (L’),</sm>
        </vedette>
        <definition>
            <typologie>ferme et moulin à eau</typologie>, <localisation>commune de <commune precision="certain">Bucilly</commune>
            </localisation>.
        </definition>
    </article>
 
    <article type="commune" id="DT02-00926" pg="43">
        <vedette>
            <sm>Bucilly,</sm>
        </vedette>
        <definition>
            <localisation>canton d’Hirson</localisation>.
        </definition>
        <insee>02131</insee>
    </article>
 
<article id="DT02-02196" pg="109">
      <vedette>
         <sm>Ferrières,</sm>
      </vedette>
      <definition>
         <typologie>ferme</typologie>, <localisation>commune de <commune precision="certain">la Ferté-Chevresis</commune>
         </localisation>.</definition>
</article>
 
<article type="commune" id="DT02-02197" pg="109">
      <vedette>
         <sm>Ferté-Chevresis (La),</sm>
      </vedette>
      <definition>
         <localisation>canton de Ribemont</localisation>.
      </definition>
      <insee>02306</insee>
</article>
 
</DICTIONNAIRE>
Dans mon fichier, chaque article de @type "commune" a un code INSEE placé dans l'élément <insee>.
Les articles concernant des fermes, hameaux, moulins, etc., se trouvant dans une commune n'ont quant à eux pas de code INSEE, et je souhaite leur attribuer celui de leur commune de rattachement, que j'ai identifiée grâce à l'élément <commune> dans <localisation>.
Pour ce faire, il faut que je compare le contenu de mes éléments <commune> avec celui de tous les vedette/sm de mon fichier (sachant que le nom des communes n'est pas toujours écrit de la même manière dans l'un et dans l'autre comme c'est le cas pour la Ferté-Chèvresis dans cet exemple), et ainsi récupérer le code INSEE pour le mettre dans un élément <insee_commune>.

J'ai essayé d'écrire une XSLT mais je n'ai pas réussi...

Voilà ce que j'ai fait :

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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
 
    <xsl:output method="xml" indent="yes"/>
 
    <xsl:template match="node() | @*">
        <!-- Copie à l'identique du fichier XML -->
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>
 
    <xsl:template match="article[not(@type)]">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
            <xsl:if test="contains(DICTIONNAIRE/article/vedette/sm[1], definition/localisation[1]/commune)">
                <xsl:element name="insee_commune">
                    <xsl:value-of select="DICTIONNAIRE/article/insee"/>
                </xsl:element>
            </xsl:if>
        </xsl:copy>
    </xsl:template> 
 
</xsl:stylesheet>

J'ai également tenté cela :

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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
 
    <xsl:output method="xml" indent="yes"/>
 
    <xsl:template match="node() | @*">
        <!-- Copie à l'identique du fichier XML -->
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>
 
    <xsl:template match="DICTIONNAIRE">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
            <xsl:if test="contains(../vedette/sm[1], definition/localisation[1]/commune)">
                <xsl:for-each select="article[not(@type)]">
                    <xsl:element name="insee_commune">
                        <xsl:value-of select="article/insee"/>
                    </xsl:element>
                </xsl:for-each>
            </xsl:if>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
Je ne sais plus trop comment faire...
Pouvez-vous m'aider ?
Merci !