!=和不(=)之间的区别

时间:2015-03-25 16:25:58

标签: xml xslt xslt-2.0

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?我希望这两行是等价的。为什么不呢?

4 个答案:

答案 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()仅反转它。

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

答案 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