节点测试
节点测试是 XPath 定位步骤唯一必选的部分。因此,了解节点测试对于成功使用 XPath 表达式至关重要。
有三种常见的节点测试类型:
-
名称测试,使用扩展名称以及该名称与指定轴的关系来标识要选择的节点。
-
节点类型测试,严格根据节点类型选择节点。
-
确定目标的处理指令测试,仅选择与指定类型匹配的处理指令节点。
名称测试
名称测试是最常见的一种节点测试形式,可以明确地指定要选择的节点的名称。但是,如果只指定节点名,不会自动选择相应的节点,因为文档树可能包含同 名的不同节点类型。为了选择相应的节点,名称测试只选择名称与指定名称匹配并且节点类型与指定轴的主要节点类型匹配的节点。
下表列出了各种轴的主要节点类型。
轴 | 主要节点类型 |
---|---|
除了 attribute:: 轴或 namespace:: 轴以外的任何轴(即可以包含元素的轴) | 元素 |
属性 | 属性 |
命名空间 | 命名空间 |
名称测试中指定的名称可能属于以下三种类型之一:星号 (*)、QName 或表达式 NCName:* 。下表显示的示例说明每种类型的名称如何与指定的轴配合使用,以找到特定的节点集。
名称 | 返回 | 示例 |
---|---|---|
*(星号) | 对于任何主要节点类型的节点,返回 True。 | ancestor::* 选择上下文节点的所有上级。 attribute::* 选择上下文节点的所有属性。 namespace::* 选择上下文节点的所有名称属性。 |
QName | 对于任何扩展名称等于 QName 指定的扩展名称的主要节点类型节点,返回 True。 | child::para 选择所有属于上下文节点子级的 <para> 元素节点。如果上下文节点没有 <para> 子级,则选择一个空节点集。 |
NCName:* | 对于任何扩展名称包含 NCName 展开到的命名空间 URI 的主要节点类型节点(与本地名称无关),返回 True。 |
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
如果节点测试为 QName,XPath 必须先根据 XML 文件中的上下文命名空间声明展开 QName。此展开过程与开始标记和结束标记中的元素名的展开过程相同,只是不使用通过 xmlns 声明的默认命名空间。如果 QName 没有前缀,XPath 将查找本地名称与给定 QName 匹配和命名空间 URI 为空的节点。如果 QName 的前缀与文件中的任何上下文命名空间均不对应,可能会出错。
如果节点测试为 NCName:*,XPath 展开 NCName 的方式与展开 QName 的方式相同。同样,如果 NCName 部分与文件的上下文命名空间声明中包含的任何前缀均不对应,NCName:* 可能会出错。
节点类型测试
要选择除元素节点以外(或包括元素节点)的节点类型,请使用节点类型测试。使用节点类型测试的作用是重写给定轴的主要节点类型。例如,descendant::text() 找到上下文节点以下的所有文本节点,即使下降轴的主要节点类型是元素。
有四种节点类型测试,如下表中所示。
节点类型 | 返回 | 示例 |
---|---|---|
comment() | 对注释节点返回 True。 | following::comment() 选择所有出现在上下文节点之后的注释节点。 |
node() | 对任何类型的节点返回 True。 | preceding::node() 选择所有出现在上下文节点之前的节点。 |
processing-instruction() | 对处理指令节点返回 True。 | self::processing instruction() 选择上下文节点中的所有处理指令节点。 |
text() | 对文本节点返回 True。 | child::text() 选择属于上下文节点子级的文本节点。 |
![]() |
---|
processing-instruction() 测试可能包含文本参数;在此例中,对所有名称等于文本值的处理指令返回 True。有关更多信息,请参见指定目标的处理指令测试。 |
节点类型测试结尾的括号 () 是必不可少的。如果源文档包含名称为注释、文本、处理指令或节点的节点,结尾的括号可以避免可能会产生的任何问题。如果 XPath 应用程序遇到双括号,可以确定属于节点类型测试,而不是对具有相应名称的节点的名称测试。同样,节点类型测试不是 XPath 函数,后者的引用也包含括号、空字符串或其他字符串。