Nomes de Elementos Dinâmicos
-
09-06-2019 - |
Pergunta
Quero transformar um documento XML.O XML de origem é assim:
<svc:ElementList>
<svc:Element>
<Year>2007</Year>
</svc:Element>
<svc:Element>
<Year>2006</Year>
</svc:Element>
<svc:Element>
<Year>2005</Year>
</svc:Element>
</svc:ElementList>
Eu quero transformar isso em:
<ElementList>
<NewTag2007/>
<NewTag2006/>
<NewTag2005/>
</ElementList>
A seguinte linha de código não está funcionando:
<xsl:element name="{concat('NewTag',Element/Year)}"/>
A saída é uma série de elementos parecidos com estes: <NovaTag>.(Sem os espaços...)
"//Elemento/Ano", "./Elemento/Ano", e "//svc:Elemento/Ano" também não funciona.Uma complicação é que a tag “Element” está no namespace “svc”, enquanto a tag “Year” está no namespace padrão.
De qualquer forma, estou enfrentando um problema de namespace ou estou usando incorretamente a função "concat ()"?
Solução
Provavelmente problemas de namespace e talvez um com o contexto atual.Para fonte (com declaração de namespace adicionada para torná-lo xml bem formado)
<svc:ElementList xmlns:svc="svc">
<svc:Element>
<Year>2007</Year>
</svc:Element>
<svc:Element>
<Year>2006</Year>
</svc:Element>
<svc:Element>
<Year>2005</Year>
</svc:Element>
</svc:ElementList>
a folha de estilo
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:svc="svc"
version="1.0">
<xsl:template match="svc:ElementList">
<xsl:element name="{local-name()}">
<xsl:for-each select="svc:Element">
<xsl:element name="{concat('NewTag', Year)}"/>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
lhe dará a saída que você precisa.Observe que svc:Element
precisa ser selecionado usando namespace prefixado e que o contexto ao gerar as novas tags seja svc:Element
, não svc:ElementList
.