Pregunta

Quiero transformar un documento XML.El XML fuente se ve así:

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

Quiero convertir eso en:

<ElementList>
    <NewTag2007/>
    <NewTag2006/>
    <NewTag2005/>
</ElementList>

La siguiente línea de código no funciona:

<xsl:element name="{concat('NewTag',Element/Year)}"/>

El resultado es una serie de elementos que se ven así: <NuevaEtiqueta>.(Sin los espacios...)

"//Elemento/Año", "./Elemento/Año", y "//svc:Elemento/Año" tampoco funciona.Una complicación es que la etiqueta "Elemento" está en el espacio de nombres "svc" mientras que la etiqueta "Año" está en el espacio de nombres predeterminado.

De todos modos, ¿estoy enfrentando un problema de espacio de nombres o estoy haciendo un mal uso de la función "concat()"?

¿Fue útil?

Solución

Probablemente problemas de espacio de nombres y tal vez uno con el contexto actual.Para fuente (con declaración de espacio de nombres agregada para que sea un xml bien 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>

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

le dará el resultado que necesita.Tenga en cuenta que svc:Element debe seleccionarse utilizando el prefijo de espacio de nombres y que el contexto al generar las nuevas etiquetas sea svc:Element, no svc:ElementList.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top