如何创建布尔值?

syd*_*nce 83 xml xslt boolean xslt-2.0 xslt-1.0

我是XSLT的新手,无法解决以下代码出错的问题.

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

<xsl:if test="$var'">variable is true</xsl:if>
Run Code Online (Sandbox Code Playgroud)

当它意味着虚假时,它总是返回真实.为什么?

Dim*_*hev 165

$ var变量的值定义如下:

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

   true()

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

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

   true()false()

将任何值转换为布尔值的细节在XPath规范中拼写出来:

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

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

  • 当且仅当它是非空的时,节点集才为真

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

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

在您的情况下,字符串"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()"/>


Yuv*_*dam 17

你正在使用的boolean()函数确实在做它的工作.要使用显式的true和false值,您应该使用以下函数:

<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Tomalak,看到我的回答.它更详细一些,并引用了真正的来源:W3C XPath规范,而不是"MSDN". (2认同)

小智 5

也许在这个阶段有点晚了,但是对付布尔人并不值得付出努力.下面是我如何处理从DB返回的布尔值(强制性):

<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>
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人