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
?我希望这两行是等价的。为什么不呢?
答案 0 :(得分:3)
要回答你没有提出的问题,但应该有:
"123 = (123, 2)"
返回true,因为123等于123。
"not(123 = (123, 2))"
返回false,因为如上所示,内部表达式为true - 外部not()仅反转它。
"123 != (123, 2)"
返回true,因为123不等于2.
"not(123 != (123, 2))"
返回false,因为如上所示,内部表达式为true,而外部not()仅反转它。
答案 1 :(得分:3)
使用XPath中的“常规”比较运算符(包括=
和!=
)实现的关键是它们在其参数序列中隐式存在量化。表达式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
答案 2 :(得分:2)
值得注意的是XPath如何处理这个以及SQL如何处理它之间的区别。 SQL使用三值逻辑和NULL值,因此效果是如果AUTHOR不存在(null),则AUTHOR="Kay"
和AUTHOR!="Kay"
都会产生&#34; null&#34; (或&#34; undefined&#34;,我认为他们称之为),这意味着当任一表达式用作WHERE子句中的谓词时,不会选择相关的行。 XPath还会产生如果AUTHOR不存在,则谓词AUTHOR="Kay"
和AUTHOR!="Kay"
都不会导致选择项目的结果;但与SQL不同,没有三值逻辑,这是通过让两个谓词都返回false来实现的。但是谓词返回false的结果是它的逆(not(P))
返回true,这导致not(AUTHOR="Kay")
与AUTHOR!="Kay"
产生不同影响的惊人结果。
答案 3 :(得分:1)
我不知道你为什么要测试一系列项目,但原因是
/body/test != (123,2)
返回true
是这个序列中确实有一个元素不等于test
内的值,即&#34; 123&#34;。即使并非序列中的所有项都通过测试,这种情况也会返回true。
如果您从此序列中删除,2
:
/body/test != (123)
这将不再返回true,反之亦然
not(/body/test != (123)
将返回true。
<强>样式表强>
<?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