Añadir un espacio de nombres a los elementos.
-
02-07-2019 - |
Pregunta
Tengo un documento XML con elementos sin espacios de nombres, y quiero usar XSLT para agregar espacios de nombres a ellos. 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?
Solución
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>
me sale
<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?
Otros consejos
Necesitarás dos ingredientes principales para esta receta.
El stock de salsa será la transformación de identidad , y el sabor principal será otorgado por el atributo namespace
a xsl: element
.
El siguiente código no probado debe agregar el espacio de nombres http://example.com/ 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.
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 aquí, xsl: element no tiene una manera de copiar todos los atributos del elemento tal como está (los conjuntos de atributos de uso no parecen cortarlo).