87

我对 XSLT 完全陌生,无法弄清楚以下代码哪里出错了。

<xsl:variable name="var" select="boolean('false')"/>

<xsl:if test="$var'">variable is true</xsl:if>

当它应该为假时,它总是返回真。为什么?

4

3 回答 3

169

$var 变量的值定义在:

   <xsl:variable name="var" select="boolean('false')"/>

   true()

这是因为在 XPath 中 " false" 是一个普通字符串,而不是false(),它是boolean值的构造函数false()

XPath 中的两个布尔值是(注意它们是构造的!):

   true()false()

XPath Spec中详细说明了将任何值转换为布尔值的详细信息。:

布尔函数将其参数转换为布尔值,如下所示:

  • 一个数为真当且仅当它既不是正零也不是负零也不是 NaN

  • 一个节点集当且仅当它非空时为真

  • 字符串为真当且仅当其长度非零

  • 四种基本类型以外的类型的对象以依赖于该类型的方式转换为布尔值“

在您的情况下,字符串 "false" 不是数字 0 并且具有正长度,因此应用上面第三个项目符号中的规则,产生true().

因此,要在 XSLT 1.0 中定义一个值为 的变量, false()需要编写如下定义:

   <xsl:variable name="vMyVar" select="false()"/>

或者,如果您不完全记得这一点,您可以随时写:

   <xsl:variable name="vMyVar" select="1 = 0"/>

(指定任何计算结果为false()的表达式)并且 XSLT 处理器将为您完成工作。

在 XSLT 2.0 中,最好明确指定变量的类型:

   <xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>

于 2008-12-06T17:20:36.393 回答
18

您正在使用的 boolean() 函数确实在发挥作用。要使用明确的真假值,您应该使用以下函数:

<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>

仅供参考,根据MSDN 文档,boolean() 返回以下内容:

  • 如果参数是负数或正数,则将其转换为布尔值 true。
  • 如果参数为零或 NaN 值,则将其转换为 false。
  • 如果参数是非空节点集,则将其转换为 true。一个空的节点集被转换为假。
  • 如果参数是非空字符串,则将其转换为 true。空字符串被转换为假。
  • 如果参数是四种基本类型以外的类型的对象,则以依赖于该类型的方式将其转换为布尔值。
于 2008-12-06T12:38:18.490 回答
5

在这个阶段可能有点晚了,但 imo 处理布尔值是不值得的。以下是我如何处理从数据库返回的布尔值(强制):

<xsl:variable name="vTrue" select="true()"/>                     
    <xsl:choose>
      <xsl:when test="string(Mandatory) = string($vTrue)">
        <xsl:text>Mandatory</xsl:text>
      </xsl:when>
      <xsl:otherwise>           
      </xsl:otherwise>
    </xsl:choose>

希望这可以帮助某人

于 2011-06-02T09:29:51.443 回答