Nombres de elementos dinámicos
-
09-06-2019 - |
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()"?
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
.