Aggiungi uno spazio dei nomi agli elementi
-
02-07-2019 - |
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?
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).