以下两个代码有什么区别?两个代码都会检查标记中是否存在属性:
<xsl:choose>
<xsl:when test="string-length(DBE:Attribute[@name='s0SelectedSite']/node()) > 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>
答案 0 :(得分:13)
选择的结构是
<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>
允许对第一次评估true
的测试执行多次检查和一次操作。 xsl:otherwise
用于在没有任何检查评估为true
时执行默认操作;特别是这有利于if-then-else构造(只有一个xsl:when
替代加上xsl:otherwise
块。
总是让我感到震惊的是,xsl:if
不允许使用xsl:else
替代方案,但由于xsl:choose
构造中可以使用这种方法,我认为不会添加它。也许下一个XSLT版本将包含xsl:else
?
对于其他人,xsl:when
和xsl: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
。
答案 1 :(得分:2)
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还缺少您在大多数其他语言中找到的“其他”,如果if
测试失败,您可以提供替代操作 - choose
只有一个when
和otherwise
允许你解决这个问题,但在我上面的例子中,这将是可怕的(为了证明你为什么不这样做..)
<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>
答案 2 :(得分:1)
以下两个代码有什么区别?两个代码 检查标签中是否存在属性:
这不是真的:
第一个代码片段表示 if ... then ... else 动作,而第二个片段仅表示 if ... 动作。
在提供的两个代码片段中测试的条件 - 在xsl:when
指令内和xsl:if
指令内是不同的。实际上只有xsl:if
(在第二个代码片段中)测试是否存在属性。