比较
要在 XPath 中比较两个对象,可以使用 = 测试是否相等,也可以使用 != 测试是否不相等。
对于比较运算,必须正好提供两个操作数。比较的过程是计算每个操作数,然后根据需要将操作数转换为相同的类型。按照下面的“比较的优先级顺序”中所述的过程完成比较。
所有元素和属性都是字符串,但是在进行数字比较时会自动被强制转换为整数值。在比较运算期间,文本数值会被强制转换为 long 或 double 类型,如下表所示。
有关 < 和其他二进制比较运算符的信息,请参见下面的“二进制比较运算符”。
文本类型 |
比较 |
示例 |
---|---|---|
String |
text(lvalue) op text(rvalue) |
a < GGG |
Integer |
(long) lvalue op (long) rvalue |
a < 3 |
Real |
(double) lvalue op (double) rvalue |
a < 3.1 |
单引号或双引号可以作为表达式中字符串的分隔符。这样更容易从脚本语言内部构造和传递模式。
有关如何使用 XPath 执行比较的更多信息,请参见 www.w3.org/TR/xpath 上 XML Path Language (XPath) Version 1.0 (W3C Recommendation 16 November 1999) 的第 3.4 节“Booleans”(英文)。
示例
表达式 |
引用 |
---|---|
author[last-name = "Bob"] |
至少包含一个带有 Bob 值的 <last-name> 元素的所有 <author> 元素。 |
author[last-name[1] = "Bob"] |
其第一个 <last-name> 子元素具有 Bob 值的所有 <author> 元素。 |
author/degree[@from != "Harvard"] |
包含 from 属性不等于 "Harvard" 的 <degree> 元素的所有 <author> 元素。 |
author[last-name = /editor/last-name] |
所包含的 <last-name> 元素与根元素下 <editor> 元素内部的 <last-name> 元素相同的所有 <author> 元素。 |
author[.= "Matthew Bob"] |
所有字符串值为 Matthew Bob 的 <author> 元素。 |
比较的优先级顺序
与数据类型有关的比较遵循下列优先级顺序。
如果至少有一个操作数为布尔值,每个操作数必须先转换为布尔值。
否则,如果至少有一个操作数为数字,每个操作数必须先转换为数字。
否则,如果至少有一个操作数为日期,每个操作数必须先转换为日期。
否则,两个操作数都先转换为字符串。
二进制比较运算符
一组二进制比较运算符用于比较数字并返回布尔值结果。使用 <、<=、> 和 >= 运算符分别表示小于、小于或等于、大于以及大于或等于。单引号或双引号可以作为表达式中字符串的分隔符。这样更容易从脚本语言内部构造和传递模式。
注意,这些比较运算符只能与数字一起使用。您可以比较字符串是否相等,但是如果您希望通过比较字符串来确定按照排序顺序哪一个排在首位,则需要使用 Microsoft XPath 扩展函数。
示例
表达式 |
引用 |
---|---|
author[last-name = "Bob" and price > 50] |
所包含的 <last-name> 元素带有 Bob 值、<price> 元素的值大于 50 的所有 <author> 元素。 |
degree[@from != "Harvard"] |
所有 from 属性不等于 "Harvard"<degree> 的元素。 |
book[position() <= 3] |
XML 文件中的头 3 个 <book> 元素 (1, 2, 3)。 |
示例
XML 文件 (test.xml)
<?xml version="1.0"?>
<test>
<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>
<x a="2">
<y>y2</y>
</x>
<x a="3">
<y>y3</y>
</x>
</test>
XSLT 文件 (test.xsl)
下面的 XSLT 样式表选择按照文档顺序在同辈中列为第一个的所有 <x> 元素。
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<!-- Suppress text nodes not covered in subsequent template rule. -->
<xsl:template match="text()"/>
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="*|@*"/>
<xsl:if test="text()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="/test">
<xsl:apply-templates select="//x[position() = 1 ] "/>
</xsl:template>
</xsl:stylesheet>
格式化输出
应用于上述 XML 文件的转换将产生以下结果:
<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
<x>
<y>y31</y>
<y>y32</y>
</x>