XSL:为什么没有定义`<xsl:else>`标签</xsl:else>

时间:2014-04-04 19:23:33

标签: xml xslt

对于条件检查,我们选择<xsl:choose><xsl:if>

<xsl:choose>
  <xsl:when test="expression">
    ... some output ...
  </xsl:when>
  <xsl:otherwise>
    ... some output ....
  </xsl:otherwise>
</xsl:choose>

<xsl:if test="$admin=$value1">
    <control>true</control>
</xsl:if>
<xsl:if test="not($admin=$value1)">
    <control>false</control>
</xsl:if>

为什么没有定义<xsl:else>标记?

当我使用<xsl:if>时,如果有<xsl:else>,我无需重复test="not($admin=$value1)条件。 当您有多个案件需要检查时<xsl:choose>是好的。当然,上面将模拟一个典型的' if-else ',但为什么这么多行代码 模拟 if-else 条件

我想知道为什么没有为XSL定义 <xsl:else> 标记?有什么想法吗?

3 个答案:

答案 0 :(得分:6)

这样做需要父节点除了关于配对的逻辑之外还要执行条件逻辑 - 因为xsl:ifxsl:else节点都是独立的兄弟姐妹。其他基于树的控制语法结构中存在同样的“问题”,如Knockout。

尽管xsl:if可能假设支持以下内容以避免上一个问题(节点是兄弟姐妹的问题),但这样做也会使得在繁琐的案例中使用起来更加困难。

<xsl:if test="$admin=$value1">
    <xsl:then-hypothetical>
       <control>true</control>
    </xsl:then-hypothetical>
    <xsl:else-hypothetical>
       ..
    </xsl:else-hypothetical>
</xsl:if>

此外,正如JLRishe所指出的,这种方法将远远不如支持任意数量的条件分支的xsl:choose,因为每个“else if”分支将引入一个额外的嵌套级别(或两个)元件。

因此,当需要真正的“其他”时,只需使用xsl:choose

答案 1 :(得分:3)

因为<xsl:else> 元素,如果它存在,则必须附加到<xsl:if> - 这会破坏XML创建概念之一:除非将元素分组在共同的父母,他们是独立的。换句话说,在以下结构中......

<xsl:if test="$admin=$value1">
    <control>true</control>
</xsl:if>
<xsl:else>
    <control>false</control>
</xsl:else>

......后者跟随前者(或者至少应该是)毫无意义:兄弟姐妹是独立的,test元素的<xsl:if>属性在任何情况下都不会被视为{{1} }}

现在,您可以说可以将<xsl:else>和相关的<xsl:if>放在同一个父级下。当然,这是真的 - 但是由此产生的结构可能(感谢@JLRishe提到的)仅次于<xsl:else>,因为eash <xsl:choose>-<xsl:when>-<xsl:otherwise>对需要更深的嵌套。

答案 2 :(得分:3)

没有<xsl:else>,因为语言&#34; if-then-else&#34;只是&{34; if-elseif-elseif-elseif-else&#34;的<xsl:choose>实现的一个子集。

请记住,XSLT最初是XSL-FO规范的第2章(实际上,它仍然是引用,而不是包含)。在使用XSL-FO时,有很多情况下&#34; if-then&#34;需要,而不是&#34; if-then-else&#34;。例如,考虑在文字结果元素中添加默认属性,然后覆盖它:

  <fo:block font-size="10pt">
    <xsl:if test="$needSmallFont">
      <xsl:attribute name="font-size">8pt</xsl:attribute>
    </xsl:if>
    <xsl:apply-templates/>
  </fo:block>

因为&#34; if-then-else&#34;已被<xsl:choose>覆盖,此要求意味着必须创建一个等同于&#34; if-then&#34;的XSLT。这比选择单一时更紧。

这是规范中<xsl:if>的首次出现,它回答了原始问题:

  

http://www.w3.org/TR/1998/WD-xsl-19980818#AEN1090

     

&#34; xsl:if指令提供简单的if-then条件;该   xsl:choose指令支持选择一个选项   几种可能性。&#34;