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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top