J'ai ce xml:renommer un élément avec xslt
<pos:getPositionRouter xmlns:pos="positionNS">
<positionID>
<code>1</code>
</positionID>
<parameter>?</parameter>
</pos:getPositionRouter>
et je veux renommer l'élément pos:getPositionRouter
à x:getPosition
en utilisant xslt:
<x:getPosition xmlns:x="newPositionNS">
<positionID>
<code>1</code>
</positionID>
<parameter>?</parameter>
</x:getPosition>
C'est le sylesheet je suis venu avec:
Je suis obligé d'utiliser xalan en tant que processeur xslt, et la sortie, malheureusement, est la suivante:<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
<xsl:param name="old_namespace" />
<xsl:param name="old_element_localname" />
<xsl:param name="new_namespace" />
<xsl:param name="new_element_localname" />
<xsl:template match="@*|node()">
<xsl:choose>
<xsl:when test="(local-name() = $old_element_localname) and (namespace-uri() = $old_namespace)">
<xsl:element name="{$new_element_localname}" namespace="{$new_namespace}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:when>
<!-- copy the rest as is -->
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
<getPosition xmlns="newPositionNS">
<positionID xmlns:pos="positionNS">
<code>1</code>
</positionID>
<parameter xmlns:pos="positionNS">?</parameter>
</getPosition>
L'espace de noms par défaut de l'élément getPosition
devient le nouvel espace de noms, mais les éléments de l'enfant doit rester sans espace de noms (xmlns=""
).
Est-ce que quelqu'un peut comprendre pourquoi?
Merci!
Notez que la sortie souhaitée et votre sortie réelle sont sémantiquement égale: '{newPositionNS} enfants getPosition' sont sous URI d'espace de nom null, ils ont juste URI de l'espace de noms "positionNS" dans la portée (mais non utilisé). –
Bonjour Alejandro, si je comprends bien, les deux sorties ne sont pas sémantiquement égales: le paramètre d'espace de noms par défaut xmlns = "newPositionNS" sur l'élément racine est hérité aux enfants, donc positionID est maintenant dans l'espace de noms newPositionNS, et non dans le "namespace comme il se doit. – Simon
Bonne question, +1. Voir ma réponse pour une solution courte et simple. :) –