如何在XSLT中实现if-else语句?


171

我正在尝试在XSLT中实现if -else语句,但是我的代码只是无法解析。有人有什么想法吗?

  <xsl:variable name="CreatedDate" select="@createDate"/>
  <xsl:variable name="IDAppendedDate" select="2012-01-01" />
  <b>date: <xsl:value-of select="$CreatedDate"/></b> 

  <xsl:if test="$CreatedDate > $IDAppendedDate">
    <h2> mooooooooooooo </h2>
  </xsl:if>
  <xsl:else>
    <h2> dooooooooooooo </h2>
  </xsl:else>

Answers:


316

您必须使用<xsl:choose>标签重新实现它:

       <xsl:choose>
         <xsl:when test="$CreatedDate > $IDAppendedDate">
           <h2> mooooooooooooo </h2>
         </xsl:when>
         <xsl:otherwise>
          <h2> dooooooooooooo </h2>
         </xsl:otherwise>
       </xsl:choose>

65

if语句仅用于快速检查一种情况。如果有多个选项,请<xsl:choose>按如下所示使用:

   <xsl:choose>
     <xsl:when test="$CreatedDate > $IDAppendedDate">
       <h2>mooooooooooooo</h2>
     </xsl:when>
     <xsl:otherwise>
      <h2>dooooooooooooo</h2>
     </xsl:otherwise>
   </xsl:choose>

另外,您可以使用多个<xsl:when>标记来表示If .. Else IfSwitch模式,如下所示:

   <xsl:choose>
     <xsl:when test="$CreatedDate > $IDAppendedDate">
       <h2>mooooooooooooo</h2>
     </xsl:when>
     <xsl:when test="$CreatedDate = $IDAppendedDate">
       <h2>booooooooooooo</h2>
     </xsl:when>
     <xsl:otherwise>
      <h2>dooooooooooooo</h2>
     </xsl:otherwise>
   </xsl:choose>

前面的示例等效于以下伪代码:

   if ($CreatedDate > $IDAppendedDate)
   {
       output: <h2>mooooooooooooo</h2>
   }
   else if ($CreatedDate = $IDAppendedDate)
   {
       output: <h2>booooooooooooo</h2>
   }
   else
   {
       output: <h2>dooooooooooooo</h2>
   }

1
您能否更正下面的语句,我们都知道不执行{}的if(case> x)仅会执行以下1行,我在许多初学者中看到了这一点,他们确切地写出了您在此处发表的内容,其中许多复制1:1
奥利弗·2014年

1
顺便说一句,if else条件只是一个例子,或者是一个伪代码。好吧,我考虑到您的关注,并且已经对其进行了编辑..
InfantPro'Aravind'2014年

36

如果我可以提供一些建议(两年后,但希望对以后的读者有所帮助)

  • 排除共同h2因素。
  • 排除普通ooooooooooooo文本。
  • if/then/else如果使用XSLT 2.0,请注意新的XPath 2.0 构造。

XSLT 1.0解决方案(也适用于XSLT 2.0)

<h2>
  <xsl:choose>
    <xsl:when test="$CreatedDate > $IDAppendedDate">m</xsl:when>
    <xsl:otherwise>d</xsl:otherwise>
  </xsl:choose>
  ooooooooooooo
</h2>

XSLT 2.0解决方案

<h2>
   <xsl:value-of select="if ($CreatedDate > $IDAppendedDate) then 'm' else 'd'"/>
   ooooooooooooo
</h2>

1

最简单的方法是进行第二次if测试,但条件要颠倒。与选择时嵌套嵌套块相比,此技术更短,更容易在眼睛上看到并且更容易正确使用:

<xsl:variable name="CreatedDate" select="@createDate"/>
     <xsl:variable name="IDAppendedDate" select="2012-01-01" />
     <b>date: <xsl:value-of select="$CreatedDate"/></b> 
     <xsl:if test="$CreatedDate &gt; $IDAppendedDate">
        <h2> mooooooooooooo </h2>
     </xsl:if>
     <xsl:if test="$CreatedDate &lt;= $IDAppendedDate">
        <h2> dooooooooooooo </h2>
     </xsl:if>

这是政府网站样式表中使用的技术的真实示例:http : //w1.weather.gov/xml/current_obs/latest_ob.xsl


5
必须记住并确保第二个if测试与第一个测试的补充匹配,这使得任何后续修改都更容易出错。
菲利普·安德烈·洛林

2
我同意,朋友。另外,我认为上面的示例更难阅读,而使用a则<xsl:choose>简单得多,其含义也更加清晰。
道格·巴比里

1

最初来自此博客文章。我们可以通过下面的代码来实现

<xsl:choose>
    <xsl:when test="something to test">

    </xsl:when>
    <xsl:otherwise>

    </xsl:otherwise>
</xsl:choose>

所以这就是我所做的

<h3>System</h3>
    <xsl:choose>
        <xsl:when test="autoIncludeSystem/autoincludesystem_info/@mdate"> <!-- if attribute exists-->
            <p>
                <dd><table border="1">
                    <tbody>
                        <tr>
                            <th>File Name</th>
                            <th>File Size</th>
                            <th>Date</th>
                            <th>Time</th>
                            <th>AM/PM</th>
                        </tr>
                        <xsl:for-each select="autoIncludeSystem/autoincludesystem_info">
                            <tr>
                                <td valign="top" ><xsl:value-of select="@filename"/></td>
                                <td valign="top" ><xsl:value-of select="@filesize"/></td>
                                <td valign="top" ><xsl:value-of select="@mdate"/></td>
                                <td valign="top" ><xsl:value-of select="@mtime"/></td>
                                <td valign="top" ><xsl:value-of select="@ampm"/></td>
                            </tr>
                        </xsl:for-each>
                    </tbody>
                </table>
                </dd>
            </p>
        </xsl:when>
        <xsl:otherwise> <!-- if attribute does not exists -->
            <dd><pre>
                <xsl:value-of select="autoIncludeSystem"/><br/>
            </pre></dd> <br/>
        </xsl:otherwise>
    </xsl:choose>

我的输出

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.