跳转到内容

XPath/基本语法

来自维基教科书,自由的教科书

XPath 基本语法

[编辑 | 编辑源代码]

以正斜杠“/”开头的表达式称为绝对表达式。它们从文档的根节点开始。所有其他表达式都是相对于 XML 文档中的当前位置的。

表达式是通过创建形式为 的步骤表达式列表来创建的

  step[predicate]/step[predicate]/step[predicate]

可以将谓词视为类似于 SQL 中 WHERE 子句的过滤器或条件表达式。

示例 XML 文件

[编辑 | 编辑源代码]

许多示例使用诸如以下的“books”示例

http://raw.github.com/dmccreary/learn-xquery/master/data/books.xml

通常,books 文件具有以下结构

<books>
  <book>
    <title>XQuery</title>
    <format>wikibook</format>
  </book>
</books>

基本 XPath 表达式

[编辑 | 编辑源代码]

根文档节点

 /

请注意,正斜杠返回文档根节点,而不是完整的 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]

XPath 缩写

[编辑 | 编辑源代码]

. 代表当前节点

.. 代表最近的父节点

@ 代表属性分隔符

$ 代表变量分隔符

[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

华夏公益教科书