如何创建布尔值?
Posted
技术标签:
【中文标题】如何创建布尔值?【英文标题】:How to create a boolean value? 【发布时间】:2010-09-25 15:56:00 【问题描述】:我对 XSLT 完全陌生,无法弄清楚以下代码哪里出了问题。
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
当它应该为假时,它总是返回真。为什么?
【问题讨论】:
【参考方案1】:在这个阶段可能有点晚了,但 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>
希望这对某人有所帮助
【讨论】:
【参考方案2】:$var 变量的值定义在:
<xsl:variable name="var" select="boolean('false')"/>
是
true()
这是因为在 XPath 中“false
”是一个普通字符串,而不是 false()
,后者是 boolean
值 false()
的构造函数
XPath 中的两个布尔值是(注意它们是构造的!):
true()
和 false()
XPath Spec 中详细说明了将任何值转换为布尔值的详细信息。:
"boolean 函数将其参数转换为布尔值,如下所示:
一个数为真当且仅当它 既不是正零也不是负零 也不是 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()"/>
【讨论】:
@DimitreNovaatchev 你好 Dimitre。如果布尔值在 XSL 转换文件中被硬编码,这就是解决方案。对于来自正在转换的文件中的不涉及字符串比较的false
和true
字符串,是否有一个简洁的解决方案?
@Jagger,这是另一个问题。这个问题询问“如何创建布尔值”并得到了准确的答案。您在问:“如何将特定字符串解释(或解析)为布尔值”——这是一个完全不同的问题。请问字符串比较有什么问题?【参考方案3】:
您正在使用的 boolean() 函数确实在发挥作用。要使用明确的真假值,您应该使用以下函数:
<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>
仅供参考,根据MSDN documentation,boolean() 返回以下内容:
如果参数为负数或正数,则将其转换为布尔值 true。 如果参数为零或 NaN 值,则将其转换为 false。 如果参数是非空节点集,则将其转换为真。空节点集被转换为 false。 如果参数是非空字符串,则将其转换为 true。空字符串被转换为 false。 如果参数是四种基本类型以外的类型的对象,则会以依赖于该类型的方式将其转换为布尔值。【讨论】:
您应该重新格式化列表中倒数第二项以使其更加突出,因为它是至关重要的一项。 "boolean('')" 也会产生 false。 @Tomalak,看看我的回答。它更详细一点,并引用了真正的来源:W3C XPath Spec,而不是“MSDN”。 @Dimitre:我认为 MSDN 在这方面与 W3C 规范没有太大的偏差。 :) 但是指向那里当然更正确。以上是关于如何创建布尔值?的主要内容,如果未能解决你的问题,请参考以下文章
PySpark/Hive:如何使用 LazySimpleSerDe 创建表以转换布尔值“t”/“f”?