Si vous voulez littéralement le résultat comme indiqué dans la question, ce qui est très simple à réaliser:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xml:namespace prefix="vml" ns="urn:schemas-microsoft-com:vml"/>
</xsl:template>
</xsl:stylesheet>
Cette transformation, lorsqu'elle est appliquée sur tout document XML (non utilisé), produit le résultat souhaité :
<xml:namespace prefix="vml" ns="urn:schemas-microsoft-com:vml"/>
Cependant, il me semble que vous voulez ajouter un nœud d'espace de noms à chaque élément d'un document XML donné (si ce n'est pas, me faire savoir via un commentand Je vais supprimer cette répondre).
Si oui, voici un moyen simple et efficace:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:vml="urn:schemas-microsoft-com:vml"
exclude-result-prefixes="vml">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vNamespace" select=
"document('')/*/namespace::*[name()='vml']"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="$vNamespace"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
lorsqu'il est appliqué à tout document, par exemple celui-ci:
<t>
<a x="3">
<b y="4"/>
</a>
</t>
le résultat recherché est produit:
<t xmlns:vml="urn:schemas-microsoft-com:vml">
<a x="3">
<b y="4"/>
</a>
</t>
Cela peut être déroutant à première vue car seul l'élément supérieur du résultat a visiblement le nœud d'espace de noms souhaité. Cependant, par définition (regardez le XML Namespace spec) si un élément à la racine d'un (sous-) arbre a un nœud d'espace de nommage donné, alors tous ses éléments descendants ont aussi ce nœud d'espace de nommage.Même si vous copiez l'espace de noms dans chaque élément, le sérialiseur XSLT le supprimera de la représentation sérialisée (texte) de tous sauf l'élément supérieur.
Dans XSLT 2.0 vous pouvez simplement utiliser l'instruction <xsl:namespace>
:
<xsl:namespace name="vml" select="urn:schemas-microsoft-com:vml"/>
Dois-je comprendre que vous voulez ajouter un nœud d'espace de noms à chaque élément? –
@Sawa: Je dois dire que je suis avec Dimitre pour décourager l'utilisation de xml: namespace et d'autres éléments non standard autorisés par MS. De plus, cela peut être fait avec la déclaration d'espace de nom propre 'xmlns: vml =" urn: schémas-microsoft-com: vml "' –