es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agregar nuevo elemento debajo del elemento existente utilizando XSLT.

Tengo un elemento llamado “Dispute” y quiero agregar un nuevo elemento llamado “Records” debajo de ese elemento.
Ejemplo: El XML actual está en este formato utilizando la tecnología SSIS

            <root>
            <Grade></Grade>
            <Fuel>
                <Quantity/>
                <Additional/>
                <Dispute>0</Dispute>
            </Fuel>
            <Fuel>
                <Quantity/>
                <Additional/>
                <Dispute>1</Dispute>
            </Fuel>
            </root>


            Necesito agregar un nuevo elemento debajo de dispute.

            <root>
            <Grade></Grade>
            <Fuel>
                <record>1</record>
                <Quantity/>
                <Additional/>
                <Dispute>0</Dispute>

            </Fuel>
            <Fuel>
               <record>2</record>
                <Quantity/>
                <Additional/>
                <Dispute>1</Dispute>

            </Fuel>
            </root>

XSLT no funcionó para agregar el elemento “record” con el atributo de valor 1 y 2

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

               <xsl:template match="Dispute">
               <Dispute>0</Dispute>
               <xsl:copy-of select="."/>
                  <record>1</record>
               </xsl:template>

               <xsl:template match="Dispute">
               <Dispute>1</Dispute>
               <xsl:copy-of select="."/>
                  <record>2</record>
               </xsl:template>
            </xsl:stylesheet>
Tags:  ,

Answer

  1. Avatar for davy.ai

    Hay un par de problemas con el XSLT proporcionado. Primero, el elemento <record> debe ser agregado como hijo del elemento <fuel>, no del elemento <dispute>. Segundo, hay un error de escritura en la etiqueta de cierre del elemento copy-of (falta “<“).

    Aquí tienes un XSLT actualizado que debería funcionar:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
       <!-- Transformación de identidad -->
       <xsl:template match="@* | node()">
          <xsl:copy>
             <xsl:apply-templates select="@* | node()"></xsl:apply-templates>
          </xsl:copy>
       </xsl:template>
    
       <xsl:template match="Fuel">
          <xsl:copy>
             <xsl:apply-templates select="@*"></xsl:apply-templates>
             <record><xsl:number></xsl:number></record>
             <xsl:apply-templates select="node()"></xsl:apply-templates>
          </xsl:copy>
       </xsl:template>
    </xsl:stylesheet>
    

    Este XSLT agregará un elemento <record> con un valor de 1 para el primer elemento <fuel>, y un valor de 2 para el segundo elemento <fuel>. El elemento <dispute> permanecerá sin cambios.

    Ten en cuenta que este XSLT asume que los elementos <fuel> siempre están en el orden en que aparecen en el XML de entrada. Si el orden puede variar, será necesario utilizar un método diferente para numerar los elementos <record>.

Comments are closed.