2010-09-06 11 views
20

A continuación se muestra el código XML real:elemento de adición en medio de XML mediante XSLT

<?xml version="1.0" encoding="utf-8"?> 
<employee> 
<Name>ABC</Name> 
<Dept>CS</Dept> 
<Designation>sse</Designation> 
</employee> 

y quiero que la salida de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?> 
<employee> 
<Name>ABC</Name> 
    <Age>34</Age> 
<Dept>CS</Dept> 
    <Domain>Insurance</Domain> 
<Designation>sse</Designation> 
</employee> 

Es esto posible añadir elemento XML en el medio mediante XSLT ? ¡Por favor dame la muestra!

Respuesta

32

Aquí es una hoja de estilo XSLT 1.0 que va a hacer lo que pidió:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <!-- Identity transform --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Name"> 
     <xsl:copy-of select="."/> 
     <Age>34</Age> 
    </xsl:template> 

    <xsl:template match="Dept"> 
     <xsl:copy-of select="."/> 
     <Domain>Insurance</Domain> 
    </xsl:template> 
</xsl:stylesheet> 

Obviamente la lógica variará dependiendo de dónde se va a obtener los nuevos datos de, y donde tiene que ir. La hoja de estilo anterior simplemente inserta un elemento <Age> después de cada elemento <Name> y un elemento <Domain> después de cada elemento <Dept>.

(Limitación:. Si el documento podría tener <Name> o <Dept> elementos dentro de otros <Name> o <Dept> elementos, sólo los más exteriores tendrán este proceso especial no creo que la intención para que el documento tiene este tipo de estructura recursiva , por lo que no lo afectaría, pero vale la pena mencionarlo por las dudas).

+0

¿Qué pasa si sólo desea que el elemento que se añade una vez, en lugar de una vez por cada elementos Nombre/Dept? – Joe

+1

@Joe: Wow, casi 5 años después. :-) En ese caso, agrega el elemento de resultado en una plantilla que solo coincidirá una vez. P.ej. 'match ="/*/Nombre [1] "'. – LarsH

+1

Excelente, realmente no esperaba una respuesta 5 años después, mucho menos una tan pronto! Eso ayuda mucho – Joe

2

He modificado algunas cosas en la hoja de estilos existente, le permitirá elegir el elemento específico y actualizarlo en su xml.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <!-- Identity transform --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Name[1]"> 
     <xsl:copy-of select="."/> 
     <Age>34</Age> 
    </xsl:template> 

    <xsl:template match="Dept[1]"> 
     <xsl:copy-of select="."/> 
     <Domain>Insurance</Domain> 
    </xsl:template> 
</xsl:stylesheet> 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<employee> 
<Name>ABC</Name> 
<Dept>CS</Dept> 
<Designation>sse</Designation> 
<Name>CDE</Name> 
<Dept>CSE</Dept> 
<Designation>sses</Designation> 
</employee> 
Cuestiones relacionadas