!= 和 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() 只是将其反转。

参考: http://www.w3.org/TR/xpath20/#id-value-comparisons

我不知道你为什么要针对一系列项目进行测试,但原因

/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] 具有不同的效果=].