XPath 入门指南:语法、轴与函数库详解

Alice
Alice
发布时间:2026-10-14 | 5人浏览过
原创

XPath(可扩展路径)是为XSLT转换[XSLT]和XPointer提供的共享功能,旨在对XML文档元件进行寻址,同时也支持字符串、数字和布尔操作。它使用非XML句法以便在URIs中使用,并基于XML文档的逻辑结构而非表面句法进行导航。

XPath 核心概念与数据模型

XPath 将 XML 文档建模为一棵节点树,包含多种类型的节点(如元素节点、属性节点、正文节点)。其名字来源于它在 URL 中用作对 XML 文档层次结构进行导航的路径标志。除了寻址,XPath 还能用于自然的子集匹配,即测试一个节点是否匹配特定模式,这常用于 XSLT 模板规则中。

XPath 充分支持 XML 命名空间,节点的名字被建模为由局部部分和命名空间 URI 组成的扩展名。在操作中,XPath 主要涉及以下四类返回结果:

  1. 节点集合:无序且无重复的节点集合。
  2. 布尔值:真(true)或假(false)。
  3. 数字:浮点数字。
  4. 字符串:UCS 字符的顺序。

XPath 地址路径语法

地址路径是 XPath 用于定位节点的核心语句。以下是常用语法规则及其实例解析:

第1步:理解根节点与递归搜索

  • /:选择 XML 文档的根结点。
  • /*:选择根结点的所有子节点。其中 * 匹配任意子节点。
  • //:/descendant-or-self::node() 的缩写。例如 //book 选择根结点所有后代中的 book 元素;div//para 选择 div 下的所有 para 子孙。

第2步:使用子节点与属性过滤

  • /x:选择根结点的所有 x 元素。
  • @id 或 @name:选择含有指定属性的子节点。
  • *@*:选择上下文节点的所有属性。
  • element[@attr='value']:根据属性值过滤。例如 //vendor[@id='id1_2']/book 选择符合“属性 id='id1_2'”的所有 book 元素。

第3步:位置索引与条件判断

  • para[1]:选择上下文节点的第一个 para 孩子。
  • doc/chapter[5]/section[2]:选择 doc 的第五个 chapter 的第二个 section。
  • employee[@secretary and @assistant]:选择既有 secretary 属性又有 assistant 属性的 employee 孩子。
  • chpater[title]:选择有一个或一个以上 title 孩子的 chpater 孩子。

第4步:高级轴与文本节点操作

  • text():选择上下文节点的所有正文节点孩子。
  • .//para:选择上下文节点的 para 元素子孙。
  • */para:选择上下文节点所有的 para 孙子。

轴缩写说明:

  • child:: 是缺省轴,如 div/para 实为 child::div/child::para。
  • attribute:: 可缩写为 @。

XPath 核心函数库

XPath 提供了丰富的内置函数,主要分为节点集合、字符串、布尔和数字四大类。

节点集合函数

函数签名 描述
last() 返回从表达式求值上下文中的上下文大小(最后一个位置的数字)。
position() 返回当前上下文位置。
count(node-set) 返回参数 node-set 中节点的个数。
id(object) 通过元素的唯一 ID 选择它们。
local-name(node-set?) 返回节点扩展名的局部部分。
namespace-uri(node-set?) 返回第一个节点的命名空间 URI(仅适用于元素和属性节点)。
name(node-set?) 返回第一个节点的 QName(扩展名),通常等同于 local-name。

字符串函数

  • string(object?):将对象转换为字符串。
  • concat(string, string...):返回参数的联结。
  • starts-with(string, string):如果第一个字符串以第二个开头,返回真。
  • contains(string, string):如果第一个字符串包含第二个字符串,返回真。
  • substring-before(string, string):返回第一个参数在第二个参数首次出现之前的子串。例:substring-before("1999/04/01","/") 返回 1999。
  • substring(, number, number?):从指定位置开始截取指定长度的子串。若省略长度,则截取到末尾。例:substring("12345",2,3) 返回 "234"。
  • string-length(string?):返回字符串字符数。
  • normalize-space(string?):清除首尾空白并将连续空白替换为单个空格。
  • translate(string, string, string):将第一个字符串中在第二个字符串出现的字符,替换为第三个字符串中对应位置的字符。例:translate("bar","abc","ABC") 返回 BAr。

布尔函数

包括 boolean(object)、not(boolean)、true()、false() 以及 lang(string) 用于检测语言环境。

数字函数

  • number(object?):将参数转换为数字。
  • sum(node-set):返回节点集中每个节点转数字后的总和。
  • floor(number):返回不大于参数的最大整数。
  • ceiling(number):返回不小于参数的最小整数。
  • round(number):返回最接近参数的整数(平局时取正无穷大方向);处理 NaN、无穷大及零有特定规则。

相关规范参照

XPath 的设计严格遵循 W3C 标准,开发者在进行复杂解析时可参照以下规范:

以上就是 XPath 入门语法的详细内容,更多关于 XPath 高级应用与实战案例的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表