13.6 比较表达式
XQuery提供了3种类型的比较:
值比较:主要使用eq、ne、lt、le、gt和ge等比较运算符。
通用比较:主要使用=、!=、<、<=、>和>=等比较运算符。
节点比较:主要使用is、>>和<<等比较运算符。
13.6.1 值比较
值比较的运算符如表13.2所示。
表13.2 XQuery支持的值比较运算符
值比较运算符通常只对字符串类型和数值类型等原子值起作用,因此XQuery在进行值比较运算时,一定会试图将操作数转换为原子值。如果值比较表达式中的操作数是一个空序列,则返回的结果也是空序列;如果操作数是长度大于1的序列,那么将引发类型转换错误;如果操作数是长度为1的序列,且该序列包含的序列项是xs:string类型或xs:untypedAtomic类型,则在将操作数转换为xs:string或xs:untypedAtomic类型的值后进行比较。
例如:
<a>5</a> eq <a>5</a>:返回true。
<a>5</a> eq <b>5</b>:返回true,因为两个操作数都可转换为5。
13.6.2 通用比较
通用比较的运算符有=、!=、<、<=、>和>=,通用比较表达式的操作数可以是任何长度的序列。只要第一个序列中有一个序列项和第二个序列中的某一个序列项满足通用比较运算符的要求就返回true;否则返回false。
对于如下例子:
只要$book/author表达式返回的节点序列中有一个序列项的值等于"Yeeku",上面的通用比较表达式就返回true。只有当上面的$book/author表达式返回的节点序列中所有序列项的值都不等于"Yeeku"时才返回false。
例如:
(1,2)=(2,3):返回true,因为第一个序列中的第2项和第二个序列中的第1项相等。
(1,2) !=(2,3):返回true,因为第一个序列中的第1项和第二个序列中的第2项不相等。
注意
通用比较运算符中,=和!=并不互为逆运算。完全有可能两个序列在使用=和!=比较时都返回true。
13.6.3 节点比较
节点比较的运算符如表13.3所示:
表13.3 XQuery支持的节点比较运算符
在进行节点比较时,每个操作数都只能是包含一项或零项的序列,否则将引发类型转换错误。只要有一个操作数是不包含任何项的空序列,比较的结果就是空序列;如果两个操作数都是只包含一个节点的序列,则根据两个序列里所包含的节点进行比较。
假设依然对13.4节所示XML文档进行查询,对于如下XQuery:
程序清单:codes\13\13.6\is.xq
因为上面的XQuery查询的is运算符前后两个序列都只包含一个节点,而且两个序列所包含的节点是同一个节点,因此上面的XQuery将返回true。
对于如下XQuery:
程序清单:codes\13\13.6\pre.xq
因为在list.xml文档中doc("list.xml")/list元素位于/list/book[1]节点之前(父元素总是位于其所有子元素之前),因此上面的XQuery查询将返回true。