2011-07-01 25 views
5

Soy un nuevo usuario de XSLT y he estado luchando con este problema.XSL para copiar el nodo raíz en + agregar atributos

Fuente XML:

<ABC X="" Y="" Z=""/> 

Resultado XML:

<CDE F=""> 
<ABC X="" Y="" Z"" G=""/> 
</CDE> 

Por lo tanto tengo que

  • Crear un nodo raíz con un atributo con un valor por defecto en el xml resultado.
  • Copiar nodo (la fuente tiene un solo nodo) desde el origen hasta el resultado xml.
  • Agregue atributos adicionales al nodo copiado de la fuente xml.

Puedo hacer esto por separado, pero no puedo hacer todo esto en un XSLT.

+1

+1 por pregunta limpia. –

+0

+1 por lo que dijo el poder –

Respuesta

2

Dado su hipótesis, parece que necesita una plantilla mínima:

<xsl:template match="ABC"> 
<CDE F=""> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:attribute name="G">hello</xsl:attribute> 
    </xsl:copy> 
</CDE> 
</xsltemplate> 

o, si lo prefiere:

<xsl:template match="/"> 
<CDE F=""> 
    <xsl:apply-templates select="ABC"/> 
</CDE> 
</xsl:template> 

<xsl:template match="ABC"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:attribute name="G">hello</xsl:attribute> 
    </xsl:copy> 
</xsl:template> 
0

Su ejemplo XML no lo necesitan (ver @ respuesta de empo), pero al comenzar, lo más importante para aprender es la plantilla de "transformación de identidad". Básicamente, copia toda su entrada XML tal cual y sin modificaciones. Cualquier cambio que necesite realizar generalmente se puede hacer anulando la transformación de identidad con otras plantillas.

He aquí un ejemplo de estilo que proporciona la salida que está buscando:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!--IDENTITY TRANSFORM--> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/ABC"> 
    <CDE F=""> 
     <ABC G=""> 
     <xsl:copy-of select="@*"/> 
     </ABC> 
    </CDE> 
    </xsl:template> 

</xsl:stylesheet> 

NOTA: "transformar la identidad" El no acostumbrarse al procesar su entrada XML porque la plantilla se encarga de la match="/ABC" uno elemento que tienes. Sin embargo, si añadiera algo a su XML, se incluiría sin cambios en la salida.

Por ejemplo, esta entrada XML modificado:

<ABC X="" Y="" Z=""> 
    <FOO BAR=""/> 
</ABC> 

transfomed con la siguiente hoja de estilo (igual al anterior, sólo añade el <xsl:apply-templates/> a la plantilla /ABC):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!--IDENTITY TRANSFORM--> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/ABC"> 
    <CDE F=""> 
     <ABC G=""> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
     </ABC> 
    </CDE> 
    </xsl:template> 

</xsl:stylesheet> 

produce el siguiente salida:

<CDE F=""> 
    <ABC G="" X="" Y="" Z=""> 
     <FOO BAR=""/> 
    </ABC> 
</CDE> 
Cuestiones relacionadas