J'ai un document XML avec des éléments non-namespaced, et je veux utiliser XSLT pour leur ajouter des espaces de noms. La plupart des éléments seront dans l'espace de noms A; quelques-uns seront dans l'espace de noms B. Comment est-ce que je fais ceci?Ajouter un espace de noms aux éléments
Répondre
Avec foo.xml
<foo x="1">
<bar y="2">
<baz z="3"/>
</bar>
<a-special-element n="8"/>
</foo>
et foo.xsl
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="A" >
<xsl:copy-of select="attribute::*"/>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="a-special-element">
<B:a-special-element xmlns:B="B">
<xsl:apply-templates match="children()"/>
</B:a-special-element>
</xsl:template>
</xsl:transform>
Je reçois
<foo xmlns="A" x="1">
<bar y="2">
<baz z="3"/>
</bar>
<B:a-special-element xmlns:B="B"/>
</foo>
Est-ce que vous cherchez?
Voici ce que j'ai jusqu'à présent:
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="A" >
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="a-special-element">
<B:a-special-element xmlns:B="B">
<xsl:apply-templates />
</B:a-special-element>
</xsl:template>
Cela fonctionne presque; le problème est qu'il ne copie pas les attributs. D'après ce que j'ai pu lire, xsl: element n'a pas le moyen de copier tous les attributs de l'élément tel qu'il est (use-attribute-sets ne semble pas le couper).
Vous n'avez pas lu la bonne documentation. Utilisez la force, lisez la spécification, c'est très bien écrit et accessible. – ddaa
Vous aurez besoin de deux ingrédients principaux pour cette recette.
Le stock de sauce sera le identity transform, et l'attribut principal sera donné par l'attribut namespace
à xsl:element
.
Le code suivant, non testé, doit ajouter l'espace de noms http://example.com/ à tous les éléments.
<xsl:template match="*">
<xsl:element name="xmpl:{local-name()}" namespace="http://example.com/">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
Message personnel: Bonjour, Jeni Tennison. Je sais que vous lisez ceci.
Yup; J'ai googlé une réponse avant votre poste, et c'était essentiellement la même chose. La seule différence est que j'utilise à la place, mais je crois qu'ils sont fonctionnellement identiques. –