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

spi*_*man 2 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

use*_*740 6

这样做需要父节点除了关于配对的逻辑之外还执行条件逻辑 - 因为节点xsl:if和xsl: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>
Run Code Online (Sandbox Code Playgroud)

此外,正如JLRishe指出的那样,这种方法将大大低于xsl:choose支持任意数量的条件分支,因为每个"else if"分支将引入另外一级(或两个)嵌套元素.

因此,当需要真正的"其他"时,只需使用即可xsl:choose.

  • 它实际上会比`xsl:choose`更糟糕,因为每个'else-if`都需要更深更深的嵌套. (3认同)
  • 是的,完全是我的想法:这个结构只是镜像`<xsl:choose> - <xsl:when> - <xsl:otherwise>`. (2认同)
  • @JLRishe非常好的观察.我已将此添加到我的答案中. (2认同)