如何创建布尔值?


86

我对XSLT完全陌生,无法通过以下代码找出我哪里出错了。

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

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

当本应为假时,它始终返回true。为什么?


3
这只是一个建议,但是如果您将标题写成一个适当的问题并且避免33岁以下的人讲话,那么您可能会得到更好的回答。
Will Dean

Answers:


168

$ var变量的值,定义如下:

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

   true()

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

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

   true()false()

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

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

  • 当且仅当它既不是正负零也不是NaN时,数字才为真

  • 当且仅当节点集为非空时,节点集才为true

  • 当且仅当其长度为非零时,字符串才为true

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

在您的情况下,字符串“ false”不是数字0,并且长度为正,因此将应用上面第3个项目符号中的规则,得出 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()"/>


@DimitreNovatchev您好Dimitre。如果布尔值在XSL转换文件中被硬编码,则这是解决方案。是否有一个整洁的解决方案false,并true从该文件下,不涉及字符串对比转型是未来的字符串?
贾格尔

1
@Jagger,这是另一个问题。该问题询问“如何创建布尔值”,并获得了准确的答案。您在问:“如何将特定的字符串解释(或解析)为布尔值”-这是一个完全不同的问题。请问字符串比较有什么问题吗?
Dimitre Novatchev 2015年

17

您正在使用的boolean()函数确实可以完成它的工作。要使用显式的true和false值,应使用以下函数:

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

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

  • 如果参数为负数或正数,则将其转换为布尔值true。
  • 如果参数为零或NaN值,则将其转换为false。
  • 如果参数是非空节点集,则将其转换为true。空节点集将转换为false。
  • 如果参数是非空字符串,则将其转换为true。空字符串将转换为false。
  • 如果参数是四种基本类型以外的其他类型的对象,则它将以依赖于该类型的方式转换为布尔值。

您应该重新格式化列表中倒数第二个项目以使其更加突出,因为这是至关重要的一项。“ boolean('')”也会产生false。
托玛拉克

2
@Tomalak,看看我的回答。它稍微详细一点,并引用了真正的来源:W3C XPath Spec,而不是“ MSDN”。
Dimitre Novatchev

1
@Dimitre:在这方面,我认为MSDN与W3C规范的差异不大。:)但是指向那里当然更正确。
Tomalak

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>

希望这可以帮助某人

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.