什么时候和XSLT属性有什么区别

时间:2012-04-17 10:12:55

标签: xml xslt

以下两个代码有什么区别?两个代码都会检查标记中是否存在属性:

<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>

3 个答案:

答案 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:whenxsl:if中的测试完全相同:检查条件。

请注意xsl:if的结构只是

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

单个

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

无效:xsl:when元素始终xsl:choose的子级。 xsl:choose可能只有子xsl:whenxsl: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只有一个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>

答案 2 :(得分:1)

  

以下两个代码有什么区别?两个代码   检查标签中是否存在属性:

这不是真的

  1. 第一个代码片段表示 if ... then ... else 动作,而第二个片段仅表示 if ... 动作。

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