20 julio 2015

XSLT: mover un atributo dado de un elemento XML a otro

Supongamos que tenemos el siguiente XML, llamemos al archivo order.xml:

<Order id="0001">
    <Customer id="1">Juan Perez</Customer>
</Order>

Y queremos mover el atributo "id" del elemento "Order" a un nuevo elemento "Extension", llamemos al archivo resultante order.out.xml:

<Order>
   <Customer id="1">Juan Perez</Customer>
   <Extension id="0001"/>
</Order>

Para obtener la transformación deseada, ejecutamos la siguiente XSLT, llamémosla move_id_attribute_under_extension_element.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output omit-xml-declaration="no" indent="yes" />

    <!-- copiar todos los nodos excepto el nodo Order -->    
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

    <!-- cuando se encuentra el elemento Order -->
    <xsl:template match="Order">
        <!-- copiar el elemento Order, con modificaciones -->
        <Order>
            <!-- copiar todos los nodos que se encuentran dentro de Order excepto el atributo id, que se mueve a <Extension id="..."> -->
            <xsl:apply-templates select="node()|@*[local-name() != 'id' ]" />
            <!-- mover el atributo id del elemento Order a un elemento nuevo Extension -->
            <Extension>
                <xsl:attribute name="id">
                    <xsl:value-of select="./@id"/>
                </xsl:attribute>
            </Extension>
        </Order>
    </xsl:template>
</xsl:stylesheet>

Para ejecutar la XSLT desde Ubuntu:

$ saxon-xslt -o order.out.xml order.xml move_id_attribute_under_extension_element.xsl

Para instalar saxon-xslt en Ubuntu:

$ sudo apt-get install libsaxon-java


No hay comentarios.: