xsl中的条件语句

too*_*les 20 xslt

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

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

谁能提供一些例子?

提前致谢!

Tom*_*lak 41

XSLT中的条件是一元"if":

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

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

<xsl:choose>
  <xsl:when test="some Boolean condition">
    <!-- "if" stuff -->
  </xsl:when>
  <xsl:otherwise>
    <!-- "else" stuff -->
  </xsl:otherwise>
</xsl:choose>
Run Code Online (Sandbox Code Playgroud)

哪里有<xsl:when>你想要的空间.

根据一组规则,可以将每个XPath表达式计算为布尔值.这些(在大多数情况下)归结为"如果有什么 - > true"/"如果没有 - > 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>
Run Code Online (Sandbox Code Playgroud)

编写匹配特定节点并使用<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>
Run Code Online (Sandbox Code Playgroud)

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