Home > database >  XSLT Can't get conditionals to point to attribute values in xslt
XSLT Can't get conditionals to point to attribute values in xslt

Time:05-03

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 &gt; 0">
                     <div class = "floatright">
                        <p>
                           <xsl:value-of select="atributo/@TITULO"/>
                        </p>
                     </div>
                  </xsl:if>
                  <xsl:if test="atributo/@GRATUITO &lt; 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 &gt; 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'] &gt; 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&oacute;ximos 100 d&iacute;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.

  • Related