xml - sirve - Agregar un espacio de nombre a los elementos
error de lectura xml: prefijo no vinculado a un espacio de nombres (3)
Tengo un documento XML con elementos no espaciados, y quiero usar XSLT para agregarles espacios de nombres. La mayoría de los elementos estarán en el espacio de nombres A; algunos estarán en el espacio de nombres B. ¿Cómo hago esto?
Con foo.xml
<foo x="1">
<bar y="2">
<baz z="3"/>
</bar>
<a-special-element n="8"/>
</foo>
y 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>
yo obtengo
<foo xmlns="A" x="1">
<bar y="2">
<baz z="3"/>
</bar>
<B:a-special-element xmlns:B="B"/>
</foo>
¿Es eso lo que estás buscando?
Esto es lo que tengo hasta ahora:
<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>
Esto casi funciona; el problema es que no está copiando atributos. Por lo que he leído hasta ahora, xsl: element no tiene una forma de copiar todos los atributos del elemento tal como está (use-attribute-sets no parece cortarlo).
Necesitarás dos ingredientes principales para esta receta.
El stock de salsa será la transformación de identidad , y el sabor principal estará dado por el atributo de namespace
para xsl:element
.
El siguiente código, no probado, debe agregar el http://example.com/ namespace a todos los elementos.
<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>
Mensaje personal: Hola, Jeni Tennison. Sé que estás leyendo esto.