XSLT 无法让条件指向 xslt 中的属性值

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

我有一个 xml 事件列表。我必须使用 xsl 格式化文档,使免费的 (@GRATUITO = 1) 显示在 html 输出的右侧,而有价格的显示在左侧。经过 2 天的研究,这就是我设法拼凑起来的东西,但肯定还缺少一些东西,我发现自己迷失在混合信息的海洋中。

我应该使用模板而不是“for-each”循环吗?是不是条件运算符错了?

 <?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>

您正在尝试访问节点的值,就好像它是属性的值一样:

 <xsl:if test="atributo/@GRATUITO &gt; 0">

您正在尝试测试不存在的属性 GRATUITO 的值,因为属性名为 nombre

 <atributo nombre="GRATUITO">0</atributo>

尝试使用这个结构:

 <xsl:if test="atributo[@nombre='GRATUITO'] &gt; 0">

您没有 post 预期的结果,您的来源 XML 有语法错误。

我猜你想做这样的事情:

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>

给定一个 well-formed XML 输入,例如:

<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>

这将产生:

结果

<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 class="head">
         <h1>Actividades Culturales y de Ocio Municipal en los pr&oacute;ximos 100 d&iacute;as</h1>
      </div>
      <div class="mainbox">
         <div class="floatright">
            <p>Actividades de reciclaje y propuesta de mobiliario participativo</p>
         </div>
         <div class="floatleft">
            <p>Burlas, chanzas y donaires</p>
         </div>
      </div>
   </body>
</html>

注意使用 predicates 而不是 xsl:if