Ajouter un espace de noms aux éléments
-
02-07-2019 - |
Question
J'ai un document XML avec des éléments non-nommés, et je souhaite utiliser XSLT pour leur ajouter des espaces de nom. La plupart des éléments seront dans l'espace de noms A; quelques-uns seront dans l'espace de noms B. Comment puis-je faire cela?
La solution
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 ce que vous cherchez?
Autres conseils
Vous aurez besoin de deux ingrédients principaux pour cette recette.
Le stock de sauce sera la transformation d'identité et la saveur principale. sera attribué par l'attribut namespace
à xsl: élément
.
Le code non testé suivant doit ajouter l’espace de nom 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.
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 d'attributs. D'après ce que j'ai lu, xsl: element ne permet pas de copier tous les attributs de l'élément tel quel (use-attribut-ensembles ne semble pas le couper).