XSL条件:仅在满足条件时如何从列表中选择值?

时间:2019-09-18 07:00:29

标签: xslt conditional-statements

我正在尝试实现一种逻辑,如果符合条件,它将选择一个值。问题是,如果我的列表中包含的元素多于一个,它将不会显示与条件匹配的值,而只会显示第一个。您能提供一些建议吗?谢谢。我需要它来实现按条件的多重过滤。这意味着在此for-each中,我将只显示2008年的书籍,但在另一张表中,我也可以使用年份列表中的2010年。下面的示例是一个使用2008年表格的模板的一部分,但是我将有多个表格在2010年之前也可以过滤图书。

XSL:

<xsl:for-each select="years">
    <xsl:choose>
        <xsl:when test="year=2008">
            <td class="year"><xsl:value-of select="year"/></td>
        </xsl:when>
    </xsl:choose>
</xsl:for-each>

XML:


    <book>
        <title>Professional ASP.NET 4 in C# and VB</title>
        <author>Bill Evjen, Scott Hanselman, Devin Rader</author>
        <country>USA</country>
        <price>580</price>
        <years>
            <year>2010</year>
            <year>2008</year>
        </years>
        </book>

此人会将 2010 填充到我的HTML中,而不是我期望的 2008 中。这完全可行吗?

更新:

我尝试过这种方法,例如分别针对多个条件进行过滤:

            <xsl:for-each select="library/book">
            <tr>
              <td class="filterTd title"><xsl:value-of select="title"/></td>
              <td class="filterTd author"><xsl:value-of select="author"/></td>
              <td class="filterTd price"><xsl:value-of select="price"/></td>
              <xsl:for-each select="years/year[.2008]">
              <td class="year">
                <xsl:value-of select="."/>
              </td>
              </xsl:for-each>
              <xsl:for-each select="years/year[.2010]">
              <td class="year">
                <xsl:value-of select="."/>
              </td>
              </xsl:for-each>
            </tr>
          </xsl:for-each>
        </table>

在我看来,这根本不会填充任何td。

1 个答案:

答案 0 :(得分:1)

如果您只想显示特定年份的图书,则可以在xsl:for-each中设置一个条件以选择图书

<xsl:for-each select="library/book[years/year=$year]">

其中$ year是包含所需年份的变量(或参数)

请注意,如果您知道要处理特定的年份,则实际上不需要执行<xsl:value-of select="year" />,只需输出您正在使用的年份值即可。

尝试使用此XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" indent="yes" />

  <xsl:template match="/">
    <xsl:call-template name="table">
      <xsl:with-param name="year" select="2008" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="table">
    <xsl:param name="year" />
    <table>
        <xsl:for-each select="library/book[years/year=$year]">
        <tr>
          <td class="filterTd title"><xsl:value-of select="title"/></td>
          <td class="filterTd author"><xsl:value-of select="author"/></td>
          <td class="filterTd price"><xsl:value-of select="price"/></td>
          <td class="year">
            <xsl:value-of select="$year"/>
          </td>
        </tr>
      </xsl:for-each>
    </table>    
  </xsl:template>
</xsl:stylesheet>

请注意,您还可以在此处使用键按年份查询图书

<xsl:key name="booksByYear" match="book" use="years/year" />

然后,xsl:for-each用于选择书籍,如下所示:

<xsl:for-each select="key('booksByYear', $year)">