Ejercicio 514
Consideremos el siguiente documento XML:
<?xml version="1.0" encoding="UTF-8"?>
<listado>
<cuenta>
<titular dni="5671001D">Ramon Perez</titular>
<saldoactual moneda="euros">12000</saldoactual>
<fechacreacion>13-abril-2012</fechacreacion>
</cuenta>
<fondo>
<cuentaasociada>20-A</cuentaasociada>
<datos>
<cantidaddepositada>20000</cantidaddepositada>
<moneda>Euros</moneda>
</datos>
</fondo>
<fondo>
<cuentaasociada>21-DX</cuentaasociada>
<datos>
<cantidaddepositada>4800</cantidaddepositada>
<moneda>Dolares</moneda>
</datos>
</fondo>
<cuenta>
<titular dni="39812341C">Carmen Diaz</titular>
<saldoactual moneda="euros">1900</saldoactual>
<fechacreacion>15-febrero-2011</fechacreacion>
</cuenta>
</listado>
Diseña un documento XSLT que permita transformar el fichero anterior en el siguiente fichero XML:
<datos>
<cuentas>
<cuenta dnititular="5671001D">
<creacion>13-abril-2012</creacion>
<titular>Ramon Perez</titular>
<saldoactual>12000 euros</saldoactual>
</cuenta>
<cuenta dnititular="39812341C">
<creacion>15-febrero-2011</creacion>
<titular>Carmen Diaz</titular>
<saldoactual>1900 euros</saldoactual>
</cuenta>
</cuentas>
<fondos>
<fondo cuentaasociada="20-A">
<cantidaddepositada>20000</cantidaddepositada>
<moneda>Euros</moneda>
</fondo>
<fondo cuentaasociada="21-DX">
<cantidaddepositada>4800</cantidaddepositada>
<moneda>Dolares</moneda>
</fondo>
</fondos>
</datos>
Solución
Debemos añadir una cabecera al documento XML (suponiendo que el nombre del fichero XSLT es 514.xsl
):
<?xml-stylesheet type="text/xsl" href="514.xsl"?>
Hoja XSL:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<datos>
<cuentas>
<xsl:for-each select="listado/cuenta">
<cuenta>
<xsl:attribute name="dnititular">
<xsl:value-of select="titular/@dni"/>
</xsl:attribute>
<creacion>
<xsl:value-of select="fechacreacion"/>
</creacion>
<titular>
<xsl:value-of select="titular"/>
</titular>
<saldoactual>
<xsl:value-of select="saldoactual"/>
<xsl:value-of select="saldoactual/@moneda"/>
</saldoactual>
</cuenta>
</xsl:for-each>
</cuentas>
<fondos>
<xsl:for-each select="listado/fondo">
<fondo>
<xsl:attribute name="cuentaasociada">
<xsl:value-of select="cuentaasociada"/>
</xsl:attribute>
<cantidaddepositada>
<xsl:value-of select="datos/cantidaddepositada"/>
</cantidaddepositada>
<moneda>
<xsl:value-of select="datos/moneda"/>
</moneda>
</fondo>
</xsl:for-each>
</fondos>
</datos>
</xsl:template>
</xsl:stylesheet>
Hoja XSL (alternativa utilizando call-template
):
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<datos>
<cuentas>
<xsl:for-each select="listado/cuenta">
<xsl:call-template name="cuenta-template" />
</xsl:for-each>
</cuentas>
<fondos>
<xsl:for-each select="listado/fondo">
<xsl:call-template name="fondo-template" />
</xsl:for-each>
</fondos>
</datos>
</xsl:template>
<xsl:template name="cuenta-template">
<cuenta>
<xsl:attribute name="dnititular">
<xsl:value-of select="titular/@dni"/>
</xsl:attribute>
<creacion>
<xsl:value-of select="fechacreacion"/>
</creacion>
<titular>
<xsl:value-of select="titular"/>
</titular>
<saldoactual>
<xsl:value-of select="saldoactual"/>
<xsl:value-of select="saldoactual/@moneda"/>
</saldoactual>
</cuenta>
</xsl:template>
<xsl:template name="fondo-template">
<fondo>
<xsl:attribute name="cuentaasociada">
<xsl:value-of select="cuentaasociada"/>
</xsl:attribute>
<cantidaddepositada>
<xsl:value-of select="datos/cantidaddepositada"/>
</cantidaddepositada>
<moneda>
<xsl:value-of select="datos/moneda"/>
</moneda>
</fondo>
</xsl:template>
</xsl:stylesheet>
Hoja XSL (alternativa utilizando apply-templates
):
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<datos>
<cuentas>
<xsl:apply-templates select="listado/cuenta" />
</cuentas>
<fondos>
<xsl:apply-templates select="listado/fondo" />
</fondos>
</datos>
</xsl:template>
<xsl:template match="listado/cuenta">
<cuenta>
<xsl:attribute name="dnititular">
<xsl:value-of select="titular/@dni"/>
</xsl:attribute>
<creacion>
<xsl:value-of select="fechacreacion"/>
</creacion>
<titular>
<xsl:value-of select="titular"/>
</titular>
<saldoactual>
<xsl:value-of select="saldoactual"/>
<xsl:value-of select="saldoactual/@moneda"/>
</saldoactual>
</cuenta>
</xsl:template>
<xsl:template match="listado/fondo">
<fondo>
<xsl:attribute name="cuentaasociada">
<xsl:value-of select="cuentaasociada"/>
</xsl:attribute>
<cantidaddepositada>
<xsl:value-of select="datos/cantidaddepositada"/>
</cantidaddepositada>
<moneda>
<xsl:value-of select="datos/moneda"/>
</moneda>
</fondo>
</xsl:template>
</xsl:stylesheet>