一个定位路径表达式返回一个节点集。
定位路径表达式
一个定位路径可以是绝对的或相对的。
绝对定位路径以一个斜线(/)开头,而相对定位路径没有。两种情况下,定位路径由一个或多个定位步骤组成,每个步骤由一个斜线分隔:
一个绝对定位路径:
/step/step/...
一个相对定位路径:
step/step/...
|
定位步骤从左到右,依次按顺序计算。每个步骤根据当前节点集的节点计算。如果定位路径是绝对的,那么当前节点集包含根节点。如果定位路径是相对的,那么当前节点集包含使用表达式的节点。定位步骤包括:
- 一个轴(指定当前定位步骤和当前节点选择的节点间的树关系)
- 一个节点测试(指定定位步骤选择的节点的节点类型和扩展名)
- 零或多个预测(使用表达式进一步抽取定位步骤选定的节点集)
一个定位步骤的语法为:
示例:
轴和节点测试
一个轴定义相对于当前节点的节点集。节点测试用于识别轴内的一个节点。我们可以通过名或类型来执行一个节点测试。
轴名 |
描述 |
ancestor |
包含当前节点的所有祖先节点
注意: 除非当前节点是根节点,否则这个轴始终包括根节点
|
ancestor-or-self |
包括当前节点和所有当前节点的祖先节点 |
attribute |
包含当前节点所有的属性 |
child |
包含当前节点所有的子节点 |
descendant |
包含当前节点的所有后代节点
注意:这个轴不包括属性或命名空间节点
|
descendant-or-self |
包含当前节点本身和所有它的后代节点 |
following |
包含文档中当前节点的结束标记后所有节点 |
following-sibling |
包含当前节点后所有的同层节点
注意: 如果当前节点是属性节点或命名空间节点,那么这个轴为空
|
namespace |
包含当前节点的所有命名空间节点 |
parent |
包含当前节点的所有父节点 |
preceding |
包含文档中当前节点的开始标记之前的所有节点 |
preceding-sibling |
包含当前节点之前的所有同层节点
注意: 如果当前节点是一个属性节点或者命名空间节点,那么这个轴为空
|
self |
当前节点本身 |
示例
示例 |
结果 |
child::cd |
选择当前节点的子节点中所有的cd元素(如果当前节点没有cd子节点,那么将返回一个空节点集) |
attribute::src |
选择当前节点的src属性(如果当前节点没有src属性,那么返回一个空节点集) |
child::* |
选择当前节点的所有子元素 |
attribute::* |
选择当前节点的所有属性 |
child::text() |
选择当前节点的文本节点子节点 |
child::node() |
选择当前节点的所有子节点 |
descendant::cd |
选择当前节点的后代中所有cd元素 |
ancestor::cd |
选择当前节点的祖先节点中所有cd元素 |
ancestor-or-self::cd |
选择当前节点的祖先节点中所有cd元素,如果当前节点是一个cd元素,那么也包括当前节点 |
child::*/child::price |
选择当前节点的孙子节点中所有price元素
|
/ |
选择文档根 |
预测
一个预测过滤一个节点集为一个新的节点集。预测放在方括号([])中。
示例
示例 |
结果 |
child::price[price=9.90] |
选择当前节点的子节点中price元素等于9.90的所有价格元素 |
child::cd[position()=1] |
选择当前节点的第一个cd子元素 |
child::cd[position()=last()] |
选择当前节点的最后一个cd子元素 |
child::cd[position()=last()-1] |
选择当前节点的倒第二个cd元素 |
child::cd[position()<6] |
选择当前节点的前五个cd元素 |
/descendant::cd[position()=7] |
选择文档中第七个cd元素 |
child::cd[attribute::type="classic"] |
选择当前节点的所有type属性等于classic的cd子节点 |
定位路径缩写语法
定位路径可以用缩写表示。
最重要的缩写为:child::可以从一个定位步骤中省略。
缩写 |
含义 |
示例 |
none |
child:: |
cd是child::cd的简写 |
@ |
attribute:: |
cd[@type="classic"]是child::cd[attribute::type="classic"]的简写 |
. |
self::node() |
.//cd是self::node()/descendant-or-self::node()/child::cd的简写 |
.. |
parent::node() |
../cd是parent::node()/child::cd的简写
|
// |
/descendant-or-self::node()/ |
//cd是/descendant-or-self::node()/child::cd的简写 |
示例
示例 |
结果 |
cd |
选择当前节点的子节点中所有cd元素 |
* |
选择当前节点的所有子元素 |
text() |
选择当前节点的子节点中所有文本节点 |
@src |
选择当前节点的所有src属性 |
@* |
选择当前节点的所有属性 |
cd[1] |
选择当前节点的第一个cd子节点 |
cd[last()] |
选择当前节点的最后一个cd子节点 |
*/cd |
选择当前节点的所有cd孙子节点 |
/book/chapter[3]/para[1] |
选择book节点的第三个chapter子节点的第一个para子节点 |
//cd |
选择所有文档根的所有cd元素后代,因而在同一个文档选择所有的cd元素作为当前节点 |
. |
选择当前节点 |
.//cd |
选择当前节点的cd元素后代 |
.. |
选择当前节点的父亲节点 |
../@src |
选择当前节点的父节点的src属性 |
cd[@type="classic"] |
选择当前节点的子节点中type属性等于classic的所有cd子节点 |
cd[@type="classic"][5] |
选择当前节点的子节点中type属性等于classic的cd子节点中第五个节点 |
cd[5][@type="classic"] |
选择当前节点的第五个cd子节点,如果该子节点的type属性等于classic |
cd[@type and @country] |
选择当前节点的子节点中由type和country两个属性的所有cd子节点 |
摘自:
http://61.139.52.111:8090/kj/Manfeel/oltl/session1/session1-p03.htm