Domanda

Ho un documento XML con elementi senza spaziatura e voglio usare XSLT per aggiungere spazi dei nomi. La maggior parte degli elementi sarà nello spazio dei nomi A; alcuni saranno nello spazio dei nomi B. Come posso farlo?

È stato utile?

Soluzione

Con foo.xml

<foo x="1">
    <bar y="2">
        <baz z="3"/>
    </bar>
    <a-special-element n="8"/>
</foo>

e 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>

Ottengo

<foo xmlns="A" x="1">
    <bar y="2">
        <baz z="3"/>
    </bar>
    <B:a-special-element xmlns:B="B"/>
</foo>

È quello che stai cercando?

Altri suggerimenti

Per questa ricetta avrai bisogno di due ingredienti principali.

Lo stock di salsa sarà la trasformazione dell'identità e il sapore principale sarà dato dall'attributo namespace a xsl: element .

Il seguente codice non testato dovrebbe aggiungere lo spazio dei nomi http://example.com/ a tutti gli elementi.

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

Messaggio personale: Ciao, Jeni Tennison. So che stai leggendo questo.

Ecco quello che ho finora:

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

Questo funziona quasi; il problema è che non sta copiando gli attributi. Da quello che ho letto così lontano, xsl: element non ha modo di copiare tutti gli attributi dall'elemento così com'è (use-attrib-sets non sembra tagliarlo).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top