Saltar al contenido principal

Ejercicio 509

Consideremos el siguiente documento XML:

<?xml version="1.0" encoding="UTF-8"?>
<inventario>
<producto codigo="P1">
<peso unidad="kg">10</peso>
<nombre>Ordenador</nombre>
<lugar edificio="B">
<aula>10</aula>
</lugar>
</producto>
<producto codigo="P2">
<peso unidad="g">500</peso>
<nombre>Switch</nombre>
<lugar edificio="A">
<aula>6</aula>
</lugar>
</producto>
</inventario>

Diseña el fichero XSLT que permita crear un documento XML de salida cuyo resultado sea el de filtrar, del XML anterior, los elementos cuyo peso sea mayor que 10.

Solución

Debemos añadir una cabecera al documento XML (suponiendo que el nombre del fichero XSLT es 509.xsl):

<?xml-stylesheet type="text/xsl" href="509.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="/">
<inventario>
<xsl:for-each select="inventario/producto">
<xsl:if test="peso &gt; 10">
<producto>
<peso>
<xsl:value-of select="peso"/>
</peso>
<nombre>
<xsl:value-of select="nombre"/>
</nombre>
<lugar>
<xsl:attribute name="edificio">
<xsl:value-of select="lugar/@edificio"/>
</xsl:attribute>
<aula>
<xsl:value-of select="lugar/aula"/>
</aula>
</lugar>
</producto>
</xsl:if>
</xsl:for-each>
</inventario>
</xsl:template>
</xsl:stylesheet>

Hoja XSL alternativa:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />

<xsl:template match="/">
<inventario>
<xsl:for-each select="//producto[peso>10]">
<xsl:copy-of select="."/>
</xsl:for-each>
</inventario>
</xsl:template>
</xsl:stylesheet>

Documento XML de salida:

<?xml version="1.0" encoding="utf-8"?>
<inventario>
<producto>
<peso>500</peso>
<nombre>Switch</nombre>
<lugar edificio="A">
<aula>6</aula>
</lugar>
</producto>
</inventario>