I have a xml list of events. I have to format the document using xsl in a way that the ones that are for free (@GRATUITO = 1) appear on the right of the html output, and the ones that have a price appear on the left side. After 2 days of research this is what I managed to pull together, but something must still be missing and I found myself lost in an ocean of mixed information.
Should I be using templates instead of a "for-each" loop? Is it the conditional operators that are wrong?
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding='UTF-8'/>
<xsl:template match="/">
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css"/>
<title>eventos</title>
</head>
<body>
<div class ="head">
<h1>
<xsl:value-of select="Contenidos/infoDataset/nombre"/>
</h1>
</div>
<div class = "mainbox">
<xsl:for-each select = "contenido/atributos">
<xsl:if test="atributo/@GRATUITO > 0">
<div class = "floatright">
<p>
<xsl:value-of select="atributo/@TITULO"/>
</p>
</div>
</xsl:if>
<xsl:if test="atributo/@GRATUITO < 1">
<div class = "floatleft">
<p>
<xsl:value-of select="atributo/@TITULO"/>
</p>
</div>
</xsl:if>
</xsl:for-each>
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XML
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="eventos.xsl"?>
<Contenidos>
<infoDataset>
<nombre>Actividades Culturales y de Ocio Municipal en los próximos 100 días</nombre>
<id>206974-0</id>
<uri>x</uri>
<descripcion> x </descripcion>
</infoDataset>
<contenido>
<tipo>Evento</tipo>
<atributos idioma="es">
<atributo nombre="ID-EVENTO">10056485</atributo>
<atributo nombre="TITULO">Actividades de reciclaje y propuesta de mobiliario participativo</atributo>
<atributo nombre="GRATUITO">1</atributo>
</atributo>
</atributos>
</contenido>
<contenido>
<contenido>
<tipo>Evento</tipo>
<atributos idioma="es">
<atributo nombre="ID-EVENTO">10046954</atributo>
<atributo nombre="TITULO">Burlas, chanzas y donaires</atributo>
<atributo nombre="PRECIO"><![CDATA[2 euros]]></atributo>
<atributo nombre="GRATUITO">0</atributo>
</atributo>
</atributos>
</contenido>
</Contenidos>
CodePudding user response:
You are trying to access the value of a node as if it was the value of an attribute:
<xsl:if test="atributo/@GRATUITO > 0">
You are trying to test for a value of the attribute GRATUITO
which does not exist because the attribute is called nombre
.
<atributo nombre="GRATUITO">0</atributo>
Try using this construct:
<xsl:if test="atributo[@nombre='GRATUITO'] > 0">
CodePudding user response:
You did not post the expected result and your source XML has syntax errors.
I am guessing you want to do something like:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding='UTF-8'/>
<xsl:template match="/Contenidos">
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css"/>
<title>eventos</title>
</head>
<body>
<div class ="head">
<h1>
<xsl:value-of select="infoDataset/nombre"/>
</h1>
</div>
<div class = "mainbox">
<div class = "floatright">
<xsl:for-each select = "contenido[atributos/atributo[@nombre='GRATUITO'] = 1]">
<p>
<xsl:value-of select="atributos/atributo[@nombre='TITULO']"/>
</p>
</xsl:for-each>
</div>
<div class = "floatleft">
<xsl:for-each select = "contenido[atributos/atributo[@nombre='GRATUITO'] = 0]">
<p>
<xsl:value-of select="atributos/atributo[@nombre='TITULO']"/>
</p>
</xsl:for-each>
</div>
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Given a well-formed XML input such as:
<Contenidos>
<infoDataset>
<nombre>Actividades Culturales y de Ocio Municipal en los próximos 100 días</nombre>
<id>206974-0</id>
<uri>x</uri>
<descripcion> x </descripcion>
</infoDataset>
<contenido>
<tipo>Evento</tipo>
<atributos idioma="es">
<atributo nombre="ID-EVENTO">10056485</atributo>
<atributo nombre="TITULO">Actividades de reciclaje y propuesta de mobiliario participativo</atributo>
<atributo nombre="GRATUITO">1</atributo>
</atributos>
</contenido>
<contenido>
<tipo>Evento</tipo>
<atributos idioma="es">
<atributo nombre="ID-EVENTO">10046954</atributo>
<atributo nombre="TITULO">Burlas, chanzas y donaires</atributo>
<atributo nombre="PRECIO"><![CDATA[2 euros]]></atributo>
<atributo nombre="GRATUITO">0</atributo>
</atributos>
</contenido>
</Contenidos>
this will produce:
Result
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="style.css">
<title>eventos</title>
</head>
<body>
<div >
<h1>Actividades Culturales y de Ocio Municipal en los próximos 100 días</h1>
</div>
<div >
<div >
<p>Actividades de reciclaje y propuesta de mobiliario participativo</p>
</div>
<div >
<p>Burlas, chanzas y donaires</p>
</div>
</div>
</body>
</html>
Note the use of predicates instead of xsl:if
.