.

J'ai un fichier XML qui me sert de template : il contient une page XHTML et un peu plus loin les données à replacer.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
<page>
 
<html>
<head><titre><mova:titre /></titre></head>
<body>...</body>
</html>
 
<mova:titre>leTitre</mova:titre>
 
</page>
Maintenant voici le fichier XSL. Il est un peu compliqué, mais les lignes qui me posent problème sont indiqué par "$$$".
Le code HTML est recopié sans problème. Mais lorsque je rencontre un tag à remplacer, ça ne va plus :


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
<?xml version="1.0" encoding="ISO-8859-1" ?>
 
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:html="http://www.w3.org/1999/xhtml" exclude-result-prefixes="html"
xmlns:mova="http://dynip.org/mova"
>
 
<xsl:output
method="xml"
indent="yes"
omit-xml-declaration="yes"
encoding="ISO-8859-1"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
/>
 
<!-- ici on recopie le code html du tag /page/html vers la sortie -->
<xsl:template match="/page/html:html//html:*">
<xsl:element name="{local-name()}">
<xsl:for-each select="attribute::*">
<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
</xsl:for-each>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
 
<!-- ici, on est sensé remplacer les appels /page/html//mova:toto par
les données /page/mova:toto.
local-name() c'est justement "toto" -->
<xsl:template match="/page/html:html//mova:*">
<xsl:value-of select="concat('/page/mova:', local-name())" /> fache $$$1$$$
</xsl:template>
 
 
<xsl:template match="/page/mova:*"></xsl:template> fache $$$2$$$
 
 
<!-- Ceci recopie les commentaires -->
<xsl:template match="comment()">
<xsl:copy />
</xsl:template>
 
 
</xsl:stylesheet>
J'ai deux problèmes :

§§1§§ : Dans le select, il y a un string, il est donc recopié tel-quel et ce n'est pas ce que je veux. Pourtant je dois bien recopier le local-name() du contexte courant pour que <mova:toto /> dans html aille cherche le contenu de <mova:toto>contenu</mova:toto>

§§2§§ : Sans cette ligne, le contenu de <mova:toto> est recopié dans la sortie. Or selon moi je ne lui ai jamais demandé de le faire.
Cette ligne, dont j'aimerais me passer, permet donc d'annuler la sortie.

Quelqu'un peut-il m'aider ?


Précision :

Un exemple particulier qui marche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
<xsl:template match="/page/html:html//mova:toto">
<xsl:value-of select="/page/mova:toto" />
</xsl:template>
Mais je n'arrive pas à généraliser :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
<xsl:template match="/page/html:html//mova:*">
<xsl:value-of select="concat('/page/mova:', local-name())" />
</xsl:template>