xml - prefijo - XSLT para cambiar el espacio de nombre en el elemento
el prefijo del espacio de nombres no está definido (1)
El siguiente XSLT lo ayudará a obtener los resultados deseados:
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.xx.com"
xmlns:ns="http://www.mnv.com/elc/sap"
exclude-result-prefixes="ns">
<xsl:output encoding=''UTF-8'' indent=''yes'' method=''xml''/>
<!-- copy everything into the output -->
<xsl:template match=''@*|node()''>
<xsl:copy>
<xsl:apply-templates select=''@*, node()''/>
</xsl:copy>
</xsl:template>
<!-- template to match ns:IRenvelope element and creating a new element -->
<xsl:template match="ns:IRenvelope">
<xsl:element name="IRL" namespace="http://www.xx.com">
<xsl:apply-templates select="@*, node()"/>
</xsl:element>
</xsl:template>
<!-- template to change the namespace
of the elements
from "http://www.mnv.com/elc/sap"
to "http://www.xx.com" -->
<xsl:template match="ns:*">
<xsl:element name="{local-name()}" namespace="http://www.xx.com">
<xsl:apply-templates select="@*, node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Aquí, las dos últimas plantillas coinciden con ns:IRenvelope
y todos los elementos con espacio de nombre http://www.mnv.com/elc/sap
, respectivamente. Usando el xsl:element
y su atributo de espacio de nombres, podemos crear los nuevos elementos con el espacio de nombre deseado.
También puede declarar los espacios de nombres deseados con prefijos y crear elementos de la siguiente manera:
<xsd:IRL xmlns:xsd="http://www.xx.com">
...
</xsd:IRL>
Para XSLT-1.0:
Simplemente reemplace el ,
(coma) para usar un |
(pipe) en apply-templates como el uso de la coma para secuenciar la acción es compatible con 2.0:
<xsl:apply-templates select="@* | node()"/>
Estoy intentando cambiar el espacio de nombre de un atributo de elemento usando el siguiente código xsl:
<xsl:stylesheet version=''2.0'' xmlns:xsl=''http://www.w3.org/1999/XSL/Transform'' xmlns:ns2="http://www.ean-ucc.org/schemas/1.3.1/eanucc">
<xsl:output encoding=''UTF-8'' indent=''yes'' method=''xml''/>
<!-- copy everything into the output -->
<xsl:template match=''@*|node()''>
<xsl:copy>
<xsl:apply-templates select=''@*|node()''/>
</xsl:copy>
</xsl:template>
<xsl:template match="IRenvelope">
<IRL xmlns:xsd="http://www.xx.com">
<xsl:copy-of select="node()|@*"/>
</IRL>
</xsl:template>
</xsl:stylesheet>
El mensaje xml que uso para probar es:
<GMessage xmlns="http://www.giffgaff.uk/CM/envelope">
<EnvelopeVersion>2.0</EnvelopeVersion>
<body>
<IRenvelope xmlns="http://www.mnv.com/elc/sap">
<Keys>
<Key Type="TaxOfficeNumber">635</Key>
</Keys>
</IRenvelope>
</body>
</GMessage>
No pude hacer que funcione y el espacio de nombres no cambia, pero ofrece el mismo resultado. cualquier ayuda por favor?
La salida xml es la siguiente:
<GMessage xmlns="http://www.giffgaff.uk/CM/envelope">
<EnvelopeVersion>2.0</EnvelopeVersion>
<body>
<IRenvelope xmlns="http://www.xx.com">
<Keys>
<Key Type="TaxOfficeNumber">635</Key>
</Keys>
</IRenvelope>
</body>
</GMessage>