me gustaría hacer estacambiar el espacio de nombres de un elemento con XSLT
<hello>
<one>
<paragraph>p1</paragraph>
</one>
</hello>
en este
<x:hello y:an_attribute="a value for an_attribute" xmlns:x="some_new_namespace" xmlns:y="other_ns">
<one>
<paragraph>p1</paragraph>
</one>
</x:hello>
esta es la hoja de estilo que se me ocurrió:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="element_localname" select="'hello'"/>
<xsl:template match="node()">
<xsl:choose>
<xsl:when test="local-name() = $element_localname">
<xsl:element name="{$element_localname}" namespace="some_new_namespace">
<xsl:attribute name="an_attribute" namespace="other_ns">a value for an_attribute</xsl:attribute>
<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>
pero por alguna extraña razón, el atributo que estoy agregando al elemento tiene el mismo espacio de nombres que el elemento raíz en sí mismo? ¿por qué?
<ns0:hello xmlns:ns0="other_ns" ns0:an_attribute="a value for an_attribute">
<one>
<paragraph>p1</paragraph>
</one>
</ns0:hello>
Gracias por leer.
El funcionamiento de su fuente a través de su transformación en xsltproc me da ' 'para el elemento' hello', que parece ser lo que quieres. Me pregunto si esto es un XSL 1.0 frente a XSL 2.0 cosa? –
Gracias por intentarlo. Estoy usando la construcción eclipse wtp en el procesador xslt. No tengo idea qué implementación usa. – Luca
Buena pregunta, +1. Vea mi respuesta para una solución mucho más simple y corta que la actualmente aceptada. :) –