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 ()"?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top