Ejercicio 522
Consideremos el siguiente documento XML.
Diseña un fichero XSLT que permita obtener la siguiente salida en XML:
<formula1>
<equipos>
<equipo>
<nombre>Mercedes-AMG Petronas F1 Team</nombre>
<motorista id="1">
<nombre>Mercedes-Benz</nombre>
<año_fundacion>1926</año_fundacion>
</motorista>
<temporada>
<año>2020</año>
<piloto id="1">
<nombre>Lewis Hamilton</nombre>
<edad>37</edad>
</piloto>
<piloto id="2">
<nombre>Valtteri Bottas</nombre>
<edad>32</edad>
</piloto>
</temporada>
<temporada>
<año>2021</año>
<piloto id="1">
<nombre>Lewis Hamilton</nombre>
<edad>37</edad>
</piloto>
<piloto id="2">
<nombre>Valtteri Bottas</nombre>
<edad>32</edad>
</piloto>
</temporada>
</equipo>
<equipo>
<nombre>Red Bull Racing Honda</nombre>
<motorista id="2">
<nombre>Honda</nombre>
<año_fundacion>1948</a ño_fundacion>
</motorista>
<temporada>
<año>2012</año>
<piloto id="4">
<nombre>Alexander Albon</nombre>
<edad>25</edad>
</piloto>
<piloto id="6">
<nombre>Sebastian Vettel</nombre>
<edad>34</edad>
</piloto>
</temporada>
<temporada>
<año>2020</año>
<piloto id="3">
<nombre>Max Verstappen</nombre>
<edad>24</edad>
</piloto>
<piloto id="4">
<nombre>Alexander Albon</nombre>
<edad>25</edad>
</piloto>
</temporada>
<temporada>
<año>2021</año>
<piloto id="3">
<nombre>Max Verstappen</nombre>
<edad>24</edad>
</piloto>
<piloto id="5">
<nombre>Sergio Pérez</nombre>
<edad>31</edad>
</piloto>
</temporada>
</equipo>
<equipo>
<nombre>Scuderia Ferrari</nombre>
<motorista id="3">
<nombre>Ferrari</nombre>
<año_fundacion>1947</año_fundacion>
</motorista>
<temporada>
<año>2020</año>
<piloto id="6">
<nombre>Sebastian Vettel</nombre>
<edad>34</edad>
</piloto>
<piloto id="7">
<nombre>Charles Leclerc</nombre>
<edad>23</edad>
</piloto>
</temporada>
<temporada>
<año>2021</año>
<piloto id="7">
<nombre>Charles Leclerc</nombre>
<edad>23</edad>
</piloto>
<piloto id="8">
<nombre>Carlos Sainz Jr.</nombre>
<edad>27</edad>
</piloto>
</temporada>
</equipo>
</equipos>
</formula1>
Solución
Hoja XSL:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<formula1>
<equipos>
<xsl:for-each select="formula1/equipos/equipo">
<xsl:variable name="equipo" select="."/>
<equipo>
<nombre>
<xsl:value-of select="nombre"/>
</nombre>
<xsl:for-each select="/formula1/motoristas/motorista">
<xsl:if test="@id=$equipo/motorista/@id">
<motorista id="{@id}">
<nombre>
<xsl:value-of select="nombre"/>
</nombre>
<año_fundacion>
<xsl:value-of select="año_fundacion"/>
</año_fundacion>
</motorista>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="temporada">
<xsl:variable name="temporada" select="."/>
<temporada>
<año>
<xsl:value-of select="año"/>
</año>
<xsl:for-each select="/formula1/pilotos/piloto">
<xsl:if test="@id=$equipo/temporada[año=$temporada/año]/piloto/@id">
<piloto id="{@id}">
<nombre>
<xsl:value-of select="nombre"/>
</nombre>
<edad>
<xsl:value-of select="edad"/>
</edad>
</piloto>
</xsl:if>
</xsl:for-each>
</temporada>
</xsl:for-each>
</equipo>
</xsl:for-each>
</equipos>
</formula1>
</xsl:template>
</xsl:transform>