vinculado sirve que prefijo para nombres namespace lectura está espacio error definido xml xslt namespaces

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.