2008-09-27 40 views
10

Tengo un documento XML con elementos no espaciados, y deseo 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?Agregue un espacio de nombres a los elementos

Respuesta

13

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> 

consigo

<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á buscando?

+0

Sí; Busqué una respuesta en Google antes de su publicación, y fue esencialmente la misma. La única diferencia es que estoy usando , pero creo que son funcionalmente idénticos. –

0

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).

+1

No ha leído la documentación correcta. Usa la fuerza, lee las especificaciones, está muy bien escrito y accesible. – ddaa

2

Necesitará dos ingredientes principales para esta receta.

El stock de salsa será el identity transform, y el sabor principal estará dado por el atributo namespace en xsl:element.

El siguiente código, no probado, debe agregar el espacio de nombre 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.

Cuestiones relacionadas