2008-08-26 17 views
13

Quiero transformar un documento XML. El XML de origen se ve así:Nombres de elementos dinámicos

<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)}"/> 

La salida es una serie de elementos que se ven así: < NewTag>. (Sin los espacios ...)

"// Elemento/Año", "./Element/Year", y "// SVC: Elemento/Año" no funcionan bien. 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 mal-utilizando la función "concat()"?

+0

Me alegro de que la solución funcione. Pero, en general, recomendaría NO crear nombres de etiquetas durante el tiempo de ejecución sobre la marcha (¡aunque funciona!). Entiendo la estructura de TAG xml de una manera más estática. Mi solución sería: tomar una etiqueta XML estática como con dicho atributo. Todavía puede acceder a él con XSLT y XPath con "element [year =" 2007 "]. Así que no pierde flexibilidad, sino que gana seguridad y consistencia ... Solo un poco. – Sauer

Respuesta

12

Probablemente problemas de espacio de nombres y tal vez uno con el contexto actual. Para la fuente (con declaración de espacio añadido para que sea 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á la salida que necesita. Tenga en cuenta que svc:Element debe seleccionarse usando el espacio de nombre prefijado y que el contexto al generar las nuevas etiquetas es svc:Element, no svc:ElementList.

+0

FYI, si necesita hacer una referencia de params en concat, use '{concat {'a', $ myParam, 'c')}' – raffian

Cuestiones relacionadas