定位器(XPath)表达式的语义
根据 XML 数据模型,XML 文档被视作包含下列类型节点的树:
- 根节点
- 元素节点
- 文本节点
- 属性节点
- 名称空间节点
- 处理指令节点
- 注释节点
这些节点之间的链接(换句话说就是树形成关系)反映 XML 文档中的直接包含关系。
根节点只能出现在根处,而不能出现在树的其它位置。它包含作为其子代的文档元素和可选注释及处理指令。
元素节点可包含任何类型的节点,但根节点除外。其它类型的节点只允许在树的终端节点位置。
有三种类型的包含链接:“子代”、“属性”和“名称空间”。“属性”和“名称空间”包含链接必须分别引导至属性和名称空间节点。换言之,要存取元素节点的子代(按照图论),需要跟随“属性”链接来查找所有包含的属性,跟随“名称空间”链接来查找所有包含的名称空间声明,跟随“子代”链接来查找包含的元素、文本节点、处理指令和注释。
需要根据上下文节点来解释 XPath 表达式,并表示一组节点。当用作 Net
Search Extender 选择器模式时,上下文节点空闲,也就是说,相对路径模式 p 解释为 //p。
下面是 Net Search Extender XPath 选择器模式:
- 上下文 N 中的 Pattern '|' LocationPathPattern 表示
Pattern 和 LocationPathPattern(都在上下文 N 中)与之相匹配的节点的并集。
- 上下文 N 中的 '/'RelativePathPattern 表示此 RelativePathPattern
在根上下文中表示的任何内容。
- 上下文 N 中的 '//'RelativePathPattern 表示在作为根的子代(在子代轴上)的任何上下文中解释的这一
RelativePathPattern 表示法的并集。
- 当且仅当上下文 N 中的节点与其父代的上下文中的 StepPattern
相匹配,且其父节点与上下文 N 中的 RelativePathPattern 相匹配时,RelativePathPattern '/' StepPattern 才与该节点相匹配。
- 当且仅当上下文 N 中的节点与其父代的上下文中的 StepPattern
相匹配,且它的祖先节点与上下文 N 中的 RelativePathPattern 相匹配时,RelativePathPattern '//' StepPattern
才与该节点相匹配。
- 上下文 N 中的 'child'::NodeTest(缩写语法:NodeTest)与作为 N 的子代(在子代轴上)且符合
NodeTest 的节点相匹配。
- 上下文 N 中的 'attribute'::NodeTest(缩写语法: @NodeTest)与作为 N 的属性且符合 NodeTest
的节点相匹配。
- 当且仅当节点为指定类型时,NodeType '(' ')' 才适合该节点。
- 'processing-instruction' '(' Literal ')' 适合将 Literal 作为其名称的任何处理指令类型节点。
- '*' 适合任何元素或属性节点(元素名称的名称屏蔽)。
- NCName ':' '*' 适合将 NCName 作为其名称前缀的任何元素节点。
- QName 适合具有指定名称的任何节点。
注意
格式为 NameTest 的 NodeTest 假定节点为所选轴上的主体类型,它是属性轴上的属性类型,也是子代轴上的子类型。因此,NameTest
不能用来选择注释或处理指令节点,而只能选择子节点和属性节点。而且,该模式允许选择任何类型的节点(名称空间节点除外),原因是不允许使用轴说明符“namespace”。
模式示例:
- chapter | appendix 表示所有章节元素和附录元素
- table 表示所有表元素
- * 表示所有元素(注意,这是子元素 ::* 的缩写)
- ulist/item 表示具有 ulist 父代的所有词条元素
- appendix//subsection 表示具有附录祖先的所有子节元素
- / 表示只包含根节点的单元素集合
- comment() 表示所有注释节点
- processing-instruction() 表示所有处理指令
- attribute::*(或 @*)表示所有属性节点
以下是定位器元素的语法:
Locator ::= LocationPathPattern
| Locator '|' LocationPathPattern
LocationPathPattern ::= '/' RelativePathPattern ?
| '//'? RelativePathPattern
RelativePathPattern ::= StepPattern
| RelativePathPattern '/' StepPattern
| RelativePathPattern '//' StepPattern
StepPattern ::= ChildOrAttributeAxisSpecifier NodeTest
ChildOrAttributeAxisSpecifier ::=
('child' | 'attribute') '::'
| '@'?
NodeTest ::= NameTest
| NodeType '(' ')'
| 'processing-instruction' '(' Literal ')'
NameTest ::= '*' | NCName ':' '*' | QName
NodeType ::= 'comment' | 'processing-instruction'
NCName 和 QName 是按“XML 名称建议”定义的:
- NCName
- 不包含冒号的 XML 名称
- QName
- 前面可以加上 NCName 后跟冒号的 NCName。例如:NCName:NCName