!= 和 not ( = ) 之间的区别
Difference between != and not ( = )
not()
运算符和!=
有什么区别?
看这个例子:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<test>123</test>
</body>
<xsl:template match="/">
<xsl:if test = "/body/test = (123, 2)">true1</xsl:if>
<xsl:if test = "not(/body/test != (123, 2))">true2</xsl:if>
</xsl:template>
http://xsltransform.net/jyH9rMx
为什么我的结果是 true1
而不是 true2
?我希望这两条线是等价的。为什么不是?
要回答你没有问的 question/s,但应该有:
"123 = (123, 2)"
returns 正确,因为 123 等于 123。
"not(123 = (123, 2))"
returns false 因为如上所示,内部表达式为 true - 而外部 not() 只是将其反转。
"123 != (123, 2)"
returns 正确,因为 123 不等于 2。
"not(123 != (123, 2))"
returns false 因为如上所示,内部表达式为真,而外部 not() 只是将其反转。
我不知道你为什么要针对一系列项目进行测试,但原因
/body/test != (123,2)
returns true
就是这个数列中确实有一个元素不等于test
里面的值,即“123”。这种情况 return 成立,即使不是序列中的所有项目都通过测试。
如果您从此序列中删除 ,2
:
/body/test != (123)
这将不再 return 正确,它的反义词
not(/body/test != (123)
将 return 为真。
样式表
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<xsl:if test = "/body/test = (123,2,3,4)">true1</xsl:if>
<xsl:if test = "not(/body/test != (123))">true2</xsl:if>
</xsl:template>
</xsl:transform>
结果
true1true2
使用 XPath 中的 "general" 比较运算符(包括 =
和 !=
)要实现的关键是它们在其参数序列上隐含地存在量化。表达式 X = Y
与 显式 quantified expression
的含义相同
some $x in X, $y in Y satisfies $x eq $y
(eq
是单项相等运算符)。所以 not(X = Y)
意味着
not(some $x in X, $y in Y satisfies $x eq $y)
相当于说
every $x in X, $y in Y satisfies $x ne $y
反之X != Y
表示
some $x in X, $y in Y satisfies $x ne $y
可能值得注意的是 XPath 如何处理它和 SQL 如何处理它之间的区别。 SQL 使用三值逻辑和 NULL 值,因此效果是如果 AUTHOR 不存在(null)则 AUTHOR="Kay"
和 AUTHOR!="Kay"
都会产生 "null"(或 "undefined",我想他们叫它),这意味着当任一表达式用作 WHERE 子句中的谓词时,不会选择相关行。 XPath 还会产生这样的结果:如果 AUTHOR 不存在,则谓词 AUTHOR="Kay"
和 AUTHOR!="Kay"
都不会导致项目被选中;但与 SQL 不同的是,没有三值逻辑,这是通过使两个谓词 return 都为假来实现的。但是谓词 return 为假的结果是它的逆谓词 (not(P))
return 为真,这导致令人惊讶的结果,即 not(AUTHOR="Kay")
与 [=11] 具有不同的效果=].
not()
运算符和!=
有什么区别?
看这个例子:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<test>123</test>
</body>
<xsl:template match="/">
<xsl:if test = "/body/test = (123, 2)">true1</xsl:if>
<xsl:if test = "not(/body/test != (123, 2))">true2</xsl:if>
</xsl:template>
http://xsltransform.net/jyH9rMx
为什么我的结果是 true1
而不是 true2
?我希望这两条线是等价的。为什么不是?
要回答你没有问的 question/s,但应该有:
"123 = (123, 2)"
returns 正确,因为 123 等于 123。
"not(123 = (123, 2))"
returns false 因为如上所示,内部表达式为 true - 而外部 not() 只是将其反转。
"123 != (123, 2)"
returns 正确,因为 123 不等于 2。
"not(123 != (123, 2))"
returns false 因为如上所示,内部表达式为真,而外部 not() 只是将其反转。
我不知道你为什么要针对一系列项目进行测试,但原因
/body/test != (123,2)
returns true
就是这个数列中确实有一个元素不等于test
里面的值,即“123”。这种情况 return 成立,即使不是序列中的所有项目都通过测试。
如果您从此序列中删除 ,2
:
/body/test != (123)
这将不再 return 正确,它的反义词
not(/body/test != (123)
将 return 为真。
样式表
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<xsl:if test = "/body/test = (123,2,3,4)">true1</xsl:if>
<xsl:if test = "not(/body/test != (123))">true2</xsl:if>
</xsl:template>
</xsl:transform>
结果
true1true2
使用 XPath 中的 "general" 比较运算符(包括 =
和 !=
)要实现的关键是它们在其参数序列上隐含地存在量化。表达式 X = Y
与 显式 quantified expression
some $x in X, $y in Y satisfies $x eq $y
(eq
是单项相等运算符)。所以 not(X = Y)
意味着
not(some $x in X, $y in Y satisfies $x eq $y)
相当于说
every $x in X, $y in Y satisfies $x ne $y
反之X != Y
表示
some $x in X, $y in Y satisfies $x ne $y
可能值得注意的是 XPath 如何处理它和 SQL 如何处理它之间的区别。 SQL 使用三值逻辑和 NULL 值,因此效果是如果 AUTHOR 不存在(null)则 AUTHOR="Kay"
和 AUTHOR!="Kay"
都会产生 "null"(或 "undefined",我想他们叫它),这意味着当任一表达式用作 WHERE 子句中的谓词时,不会选择相关行。 XPath 还会产生这样的结果:如果 AUTHOR 不存在,则谓词 AUTHOR="Kay"
和 AUTHOR!="Kay"
都不会导致项目被选中;但与 SQL 不同的是,没有三值逻辑,这是通过使两个谓词 return 都为假来实现的。但是谓词 return 为假的结果是它的逆谓词 (not(P))
return 为真,这导致令人惊讶的结果,即 not(AUTHOR="Kay")
与 [=11] 具有不同的效果=].