Bonjour,
Je débute en xslt, et j'ai un léger souci, certains éléments ne sont pas pris en compte lors de la transformation, exemple :

Voici mon fichier source :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
...
  <body>
    <p>
      <div class="class1"></div>
    </p>
    <div class="class2">
      <p>
        <div class="class1"></div>
      </p>
    </div>
  </body>
</html>
Le résultat escompté :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
<root>
  <class1 path="/html/body/*/div[@class="class1"]"/>
  <class2 path="/html/body/div[@class="class2"]">
    <class3 path="/html/body/div[@class="class2"]/*/div[@class="class3"]"/>
  </class2>
</root>
Le résultat effectif :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
<root>
  <!-- manque la class1-->
  <class2 path="/html/body/div[@class="class2"]">
    <class3 path="/html/body/div[@class="class2"]/*/div[@class="class3"]"/>
  </class2>
</root>
On constate, que l'élément P à la racine du BODY n'a pas été traitée, pourtant une même balise P à l'intérieur d'un élément DIV avec un attribut class(donc qui nous interesse) à été pris en compte plus bas.

Mon fichier de transformation XSLT
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
<xsl:template match="/*">
  <xsl:apply-templates select="html:body"/>
</xsl:template>
 
 
<xsl:template match="html:body">
  <root>
    <xsl:call-template name="treat_element">
      <xsl:with-param name="path">/html/body</xsl:with-param>
    </xsl:call-template>
  </root>
</xsl:template>
 
<xsl:template name="treat_element">
  <xsl:param name="path"/>
  <xsl:choose>
    <xsl:when test="html:*[@class]">
      <xsl:apply-templates select="html:*[@class]">
        <xsl:with-param name="path" select="$path"/>
      </xsl:apply-templates>
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates select="*">
        <xsl:with-param name="path" select="$path"/>
      </xsl:apply-templates>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
 
<xsl:template match="*">
  <xsl:param name="path"/>
  <xsl:call-template name="treat_element">
    <xsl:with-param name="path"><xsl:value-of select="$path"/>/*</xsl:with-param>
  </xsl:call-template>
</xsl:template>
 
<xsl:template match="html:*[@class]">
 ...
</xsl:template>
Je ne saisis pas où j'ai commis une erreur. Une idée de quoi cela provient ?
Merci de votre aide.
P.S.
J'imagine bien que mon code n'est pas très propre, désolé... je débute....