XPath/基本语法
以正斜杠“/”开头的表达式称为绝对表达式。它们从文档的根节点开始。所有其他表达式都是相对于 XML 文档中的当前位置的。
表达式是通过创建形式为 的步骤表达式列表来创建的
step[predicate]/step[predicate]/step[predicate]
可以将谓词视为类似于 SQL 中 WHERE 子句的过滤器或条件表达式。
许多示例使用诸如以下的“books”示例
http://raw.github.com/dmccreary/learn-xquery/master/data/books.xml
通常,books 文件具有以下结构
<books>
<book>
<title>XQuery</title>
<format>wikibook</format>
</book>
</books>
根文档节点
/
请注意,正斜杠返回文档根节点,而不是完整的 books 元素。
包含所有书籍的根节点
/books
所有 book 元素
/books/book //book
第一个版本是使用绝对路径。第二个使用相对路径 - 文件任何级别的 book 元素。
请注意,第一个表达式在未索引的 XML 中速度更快,但在索引的本机 XML 数据库中,第二个表达式速度更快。
书籍数量的计数
count(//book)
所有书籍标题
//book/title
集合中的第二本书
//book[2]
第二本书的标题
//book[2]/title
第二本书的第三位作者
//book[2]/author[3]
所有格式为“wikibook”的书籍
//book[format='wikibook']
获取所有出版商的列表
//publisher
获取出版商的唯一列表(删除重复项)
distinct-values(//publisher)
价格至少超过 30 美元的书籍
//book[list-price > 30]
. 代表当前节点
.. 代表最近的父节点
@ 代表属性分隔符
$ 代表变量分隔符
[n] 代表当前节点的第 n 个子节点
ancestor::div 代表父 div 节点集
normalize-space(firstname)="Paul" 与 Paul 匹配,无论空格分隔符如何
boolean(string($myvar) ) 检查空字符串
/ 代表根节点的绝对路径
@* 代表当前节点的所有属性
- 使用属性、节点名称和文本值的联合返回所有值
@*|node()|text()
- 使用 preceding-sibling 和 following-sibling 轴的联合返回节点的所有兄弟节点
preceding-sibling::node() | following-sibling::node()
- 返回特定类型的相邻兄弟节点
//div/following-sibling::h3
- 检查当前节点的字符串值
[. = "Matthew Bob"]
- 可以使用 count() 函数检查节点标识,以查看两个相同长度的节点集的交集是否等于任一节点集的长度(或者在单个节点集的情况下,它是否等于 1)。例如,以下查询在这种情况下返回 TRUE,因为两个节点都是相同的
count(/bk:books | /bk:books/bk:book[1]/parent::*) = 1