18

下面给出的两个代码有什么区别?两个代码都检查标签中是否存在属性:

<xsl:choose>
  <xsl:when test="string-length(DBE:Attribute[@name='s0SelectedSite']/node()) &gt; 0"> 
    <table>
        ...
    </table>
  </xsl:when>
  <xsl:otherwise>
    <table>
        ...
    </table>
  </xsl:otherwise>
</xsl:choose>

<xsl:if test="@Col1-AllocValue"> 
    <xsl:copy-of select="@Col1-AllocValue"/>
</xsl:if>
4

3 回答 3

17

选择的结构是

<xsl:choose>
    <xsl:when test="a">A</xsl:when>
    <xsl:when test="b">B</xsl:when>
    <xsl:when test="c">C</xsl:when>
    <xsl:when test="...">...</xsl:when>
    <xsl:otherwise>Z</xsl:otherwise>
</xsl:choose>

它允许对评估为 的第一个测试执行多项检查和一个操作truexsl:otherwise用于在没有任何检查评估为时执行默认操作true;特别是这有助于 if-then-else 构造(只是一个xsl:when替代方案加上一个xsl:otherwise块)。

xsl:if不允许替代方案总是让我感到震惊xsl:else,但由于这在xsl:choose构造中可用,我猜它被判断为不添加它。也许下一个 XSLT 版本将包含一个xsl:else?

其余的,测试 inxsl:when和 inxsl:if做同样的事情:检查条件。

注意结构xsl:if很简单

<xsl:if test="a">A</xsl:if>

一个

<xsl:when test="a">A</xsl:when>

将是无效的:xsl:when元素始终xsl:choose. 并且xsl:choose可能只有xsl:when孩子xsl:otherwise

于 2012-04-17T10:39:18.260 回答
3

允许您测试多个条件并仅在choose一个匹配(或默认情况)时应用。if你也可以测试,但它们是独立测试的,每个匹配的案例都会有输出。

添加更多细节(抱歉不得不匆忙离开)

choose允许您测试多种情况,并且仅在其中一个条件匹配的情况下生成输出,或者生成一些默认输出。例如:

<xsl:choose>
  <xsl:when test='@foo=1'><!-- do something when @foo is 1--></xsl:when>
  <xsl:when test='@foo=2'><!-- do something when @foo is 2--></xsl:when>
  <xsl:when test='@foo=3'><!-- do something when @foo is 3--></xsl:when> 
  <xsl:otherwise><!-- this is the default case, when @foo is neither 1, 2 or 3--></xsl:otherwise>
</xsl:choose>

如您所见,根据 的值采用“分支”之一@foo

使用if,它是一个单一的测试,并在该测试的结果上生成输出:

<xsl:if test='@foo=1'><!-- do this if @foo is 1--></xsl:if>
<xsl:if test='@foo=2'><!-- do this if @foo is 2--></xsl:if>
<xsl:if test='@foo=3'><!-- do this if @foo is 3--></xsl:if>

这里的复杂情况是失败案例- 当@foo既不是 1,2 也不是 3 时会发生什么?这种丢失的情况是由choose- 即具有默认操作的能力巧妙地处理的。

XSL 还缺少您在大多数其他语言中找到的“else”,它允许您在if测试失败时提供替代操作 - 以及choose一个单一的whenotherwise允许您解决这个问题,但在我上面的示例中,那将是可怕的(证明你为什么不这样做..)

<xsl:choose>
  <xsl:when test='@foo=1'><!-- do something when @foo is 1--></xsl:when>
  <xsl:otherwise> <!-- else -->
    <xsl:choose>
      <xsl:when test='@foo=2'><!-- do something when @foo is 2--></xsl:when>
      <xsl:otherwise> <!-- else -->
        <xsl:choose>
          <xsl:when test='@foo=2'><!-- do something when @foo is 2--></xsl:when>
          <xsl:otherwise><!-- this is the case, when @foo is neither 1, 2 or 3--></xsl:otherwise>
        </xsl:choose>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:otherwise>
</xsl:choose>
于 2012-04-17T10:23:14.343 回答
1

下面给出的两个代码有什么区别?两个代码都检查标签中是否存在属性:

这不是真的

  1. 第一个代码片段表达了一个if ... then ... else动作,而第二个片段只表达了一个if ...动作。

  2. 在提供的两个代码片段中测试的条件——xsl:when指令内和xsl:if指令内是不同的。事实上,只有xsl:if(在第二个代码片段中)测试属性是否存在。

于 2012-04-17T13:28:58.563 回答