[0]
de récupérer mon noeud racine (qui contient les infos de namespaces)
Ce n'est pas un détail mineur de se passer l'info sur le namespace ancré aux fils et parent en posant la question. Il faut le préciser explicitement si vous voulez chercher des aides. C'est tellement important ici en particulièrement. Je peux donc supposer l'élément parent a un namespace par défaut attaché et fils pour cette raison hérite le même. Mais, c'est en contradition avec le template
<xsl:template match="fils">
qui semble marcher malgré pas complètement de par la façàn la question est posé. C'est impossible. On peut le faire marcher comme ça :
<xsl:template match="*[local-name()='fils']">
Tout ça rend le narratif de la question très suspect.
[0.1] Et pour le même raisonnement, il n'y a pas de raison que ceci pusse marcher !?
<exsl:document href="{./attr1}.xml" method="xml">
Le même raisonnement conduit à une possible écriture ?
<exsl:document href="{*[local-name()='attr1']}.xml" method="xml">
[1]
Cependant il reste (au moins) 2 problèmes:
1) Avec la ligne 3, j'essaie de récupérer mon noeud racine (qui contient les infos de namespaces) mais malgré différents essais, j'obtiens toujours une balise "fils". Je pense que quelque chose m'échappe quand à l'exécution de la transformation et/ou aux expressions XPath.
2) Dans le document initial, ni le header ni les fils ne contiennent les infos des namespaces (elles sont au niveau du root) mais dans la version transformée, elles sont ajoutées au niveau du header et du fils.
[1.1] Pour 1), il n'y a pas de construction du genre xsl:copy avec un attribut @select. Ce n'est pas reconnu par le schéma de xslt et la fonctionnalité de @select est totalement inconnue. Pour faire ce genre de fonctionnalité, il faut passer par xsl:element à la place. (voir plus bas pour une tentative réécriture).
[1.2] Pour 2), ce n'est pas bien compris mais j'ai dit assez sur l'origine du problème qui a un rapport avec le namespace.
[3] Voice une réécriture qui a au moins quelque chance de conduire à quelque chose sensée.
1 2 3 4 5 6 7 8
| <xsl:template match="*[local-name()='fils']">
<exsl:document href="{*[local-name()='attr1']}.xml" method="xml">
<xsl:element name="{local-name(parent::*)}" namespace="{namespace-uri(parent::*)}">
<xsl:copy-of select="preceding-sibling::*[local-name()='header']" />
<xsl:copy-of select="." />
</xsl:element>
</exsl:document>
</xsl:template> |
Essayez-le et dites-nous qu'est-ce que ça donne.
[4] Dans un temps futur, vous voulez peut-être regarder la fonctionnalité provisionnée par xslt2 pour remplacer l'extension exsl. Mais ce n'est pas important ici par rapport de la gravité de la mal compréhension de la syntaxe de base.
Partager