Adicionar um espaço de nomes de elementos
-
02-07-2019 - |
Pergunta
Eu tenho um documento XML com elementos namespaced-un, e eu quero usar XSLT para adicionar namespaces para eles. A maioria dos elementos estarão em namespace A; alguns vão estar em namespace B. Como posso fazer isso?
Solução
Com 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>
I get
<foo xmlns="A" x="1">
<bar y="2">
<baz z="3"/>
</bar>
<B:a-special-element xmlns:B="B"/>
</foo>
É isso que você está procurando?
Outras dicas
Você vai precisar de dois ingredientes principais para esta receita.
O estoque molho será a identidade transformar , eo sabor principal será dado pelo atributo namespace
para xsl:element
.
A seguir, o código não foi testado, deve adicionar o http://example.com/ namespace a todos os 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>
Mensagem pessoal: Olá, Jeni Tennison. Eu sei que você está lendo isso.
Aqui está o que eu tenho até agora:
<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>
Esta quase funciona; o problema é que ele não está copiando atributos. Pelo que tenho lido thusfar, xsl: elemento não tem uma maneira de copiar todos os atributos do elemento como está (não-atributo utilização conjuntos de não aparecer para cortá-la).