xsl中的条件语句

时间:2009-07-21 15:13:20

标签: xslt

我在一个网站上工作,在XSL中有一些if /或语句,并且对我不确定如何完成的语言有点不了解:

如果[符合一个条件]或[条件二符合],那么[行动]否则做[替代行动]

任何人都可以提供一些例子吗?

提前致谢!

4 个答案:

答案 0 :(得分:41)

XSLT中的条件是一元“if”:

<xsl:if test="some Boolean condition">
  <!-- "if" stuff (there is no "else" here) -->
</xsl:if>

或更像其他语言的switch语句:

<xsl:choose>
  <xsl:when test="some Boolean condition">
    <!-- "if" stuff -->
  </xsl:when>
  <xsl:otherwise>
    <!-- "else" stuff -->
  </xsl:otherwise>
</xsl:choose>

您可以根据自己的喜好选择<xsl:when>个。{/ p>

每个XPath表达式都可以作为布尔值according to a set of rules进行求值。这些(在大多数情况下)归结为“如果有什么 - &gt; true”/“如果没有 - &gt; false

  • 空字符串为false
  • 0是false(所以NaN
  • 空节点集为false
  • false()的结果为false
  • 其他每个字面值都是true(最值得注意的是:'false'true'0'true
  • 表达式的结果用所述规则评估(这里不足为奇)

编辑:当然有一种更先进(也更惯用)的方法来控制程序流程,以及模板匹配:

<xsl:template match="node[contains(., 'some text')]">
  <!-- output X -->
</xsl:template>

<xsl:template match="node[not(contains(., 'some text'))]">
  <!-- output Y -->
</xsl:template>

<xsl:template match="/">
  <xsl:apply-templates select=".//node" />
</xsl:template>

编写与特定节点匹配的模板并使用<xsl:apply-templates>使XSLT处理器选择合适的模板优于编写复杂的<xsl:if><xsl:choose>结构。

以上示例等同于命令式样式:

<xsl:template match="/">
  <xsl:for-each select=".//node">
    <xsl:choose>
      <xsl:when test="contains(., 'some text')">
        <!-- output X -->
      </xsl:when>
      <xsl:when test="not(contains(., 'some text'))">
        <!-- output Y -->
      </xsl:when>
    <xsl:choose>
  <xsl:for-each>
</xsl:template>

XSLT初学者倾向于选择后者的形式以便熟悉,但是检查模板匹配而不是使用条件是值得的。 (也see。)

答案 1 :(得分:3)

XSL有<xsl:if>,但您可能更关注<xsl:choose> / <xsl:when> / <xsl:otherwise>序列。一些例子here(靠近底部)。也许:

<xsl:choose>
    <xsl:when test="[conditionOne] or [conditionTwo]">
        <!-- do [action] -->
    </xsl:when>
    <xsl:otherwise>
        <!-- do [alternative action] -->
    </xsl:otherwise>
</xsl:choose>

答案 2 :(得分:1)

一般if语句的语法是

<xsl:if test="expression">
  ...some output if the expression is true...
</xsl:if>

不确定XSL是否具有else条件,但您应该能够测试是否为true然后测试是否为false或反之。

答案 3 :(得分:0)

在这种情况下,您必须使用xsl:choose。这就像使用if / else和else else一样。

<xsl:choose>
  <xsl:when test="condition one or condition two">
    <!-- action -->
  </xsl:when>
  <xsl:otherwise>
    <!-- alternative action -->
  </xsl:otherwise>
</xsl:choose>