http://www.cnblogs.com/gakusei/articles/1582152.html
我们以一个表格来给出XPath中有效的轴。这些轴描述了XPath数据模型中的各个节点与上下文节点(context node)的关系。
名称 | 描述 |
self | 上下文节点自身 |
parent | 上下文节点的父节点,如果存在父节点的话 |
child | 上下文节点的所有子节点,不包括属性节点和命名空间节点 |
ancestor | 上下文节点的父节点,祖父节点,...,直到文档根节点,文档根节点的ancestor轴为空节点集 |
ancestor-or-self | 和ancestor相同,只是包括了上下文节点本身 |
descendant | 上下文节点的所有子节点,孙节点,...,不包括属性节点和命名空间节点 |
descendant-or-self | 和descendant相同,只是包括了上下文节点 |
preceding | 上下文节点之前的所有节点,不包括祖先节点、属性节点和命名空间节点 |
preceding-sibling | 上下文节点之前的所有兄弟节点,如果上下文节点为属性节点或命名空间节点则此轴为空 |
following | 上下文节点之后的所有节点,不包括后代节点、属性节点和命名空间节点 |
following-sibling | 上下文节点之后的所有兄弟节点,如果上下文节点为属性节点或命名空间节点则此轴为空 |
namespace | 上下文节点的命名空间节点 |
attribute | 上下文节点的所有属性节点 |
每一个轴都有一个基本节点类型(principal node type)。如果一个轴能够包含元素(element)那么该轴的基本节点类型就是元素。其它情况下,轴的基本节点类型就是轴能够包含的节点的类型。因此,有
- 属性轴(attribute axis)的基本节点类型是属性(attribute)
- 命名空间轴(namespace axis)的基本节点类型是命名空间(namespace)
- 其它轴的基本节点类型是元素(element)
这里的基本节点类型的概念在做节点测试(Node Tests)时还要用到,我到时会重再次提到它。
如果忽略属性和命名空间节点,那么ancestor,descendant,following,preceding以及self这5个轴切分整个XML文档。
最后用张图来加强一下对轴的印象,其中的红色线条表示元素节点,蓝色线条表示文本节点、注释节点与处理指令节点(图中没有出现)。
位置路径表达式
位置路径可以是绝对的,也可以是相对的。绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:
绝对位置路径:
/step/step/...
相对位置路径:
step/step/...
每个步均根据当前节点集之中的节点来进行计算。
步(step)包括:
轴(axis) 定义所选节点与当前节点之间的树关系
节点测试(node-test) 识别某个轴内部的节点
零个或者更多谓语(predicate) 更深入地提炼所选的节点集 ---用[]包括起来
步的语法:
轴名称::节点测试[谓语]
实例
例子 | 结果 |
---|---|
child::book | 选取所有属于当前节点的子元素的 book 节点 |
attribute::lang | 选取当前节点的 lang 属性 |
child::* | 选取当前节点的所有子元素 |
attribute::* | 选取当前节点的所有属性 |
child::text() | 选取当前节点的所有文本子节点 |
child::node() | 选取当前节点的所有子节点 |
descendant::book | 选取当前节点的所有 book 后代 |
ancestor::book | 选择当前节点的所有 book 先辈 |
ancestor-or-self::book | 选取当前节点的所有book先辈以及当前节点(假如此节点是book节点的话) |
child::*/child::price | 选取当前节点的所有 price 孙子--节点。 |