XPath无内置大小写不敏感比较符,可用translate()(XPath 1.0兼容,仅限ASCII)、lower-case()/upper-case()(XPath 2.0+支持Unicode)或宿主语言预处理实现。

XPath 本身没有内置的“大小写不敏感”比较操作符(比如 = 默认是区分大小写的),但有几种可靠、通用的方法实现大小写不敏感匹配,具体取决于你用的 XPath 版本和运行环境。
使用 translate() 函数(兼容 XPath 1.0)
这是最广泛支持的方式,适用于老系统(如早期 Selenium、某些 XML 解析器)。
原理:把待匹配文本和目标值都转成统一大小写(比如全小写),再比较。
//element[translate(@attribute, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'abc']
✅ 匹配 @attribute 值为 "ABC"、"Abc"、"abc" 等所有大小写变体。
⚠️ 注意:只处理 ASCII 字母;对中文、带重音符号的字符(如 é)或 Unicode 字符无效。
使用 lower-case() 或 upper-case()(XPath 2.0+)
如果你的环境支持 XPath 2.0 或更高版本(如 Saxon、XSLT 2.0+、较新版本的 lxml(需启用 EXSLT 或使用 Python 的 lxml.etree.XPath 配合 register_function)、部分现代浏览器 DevTools 中的 $x() 也支持),可以直接用:
//element[lower-case(@attribute) = 'abc']
或
//element[upper-case(text()) = 'XYZ']
✅ 支持 Unicode,更健壮;语法简洁。
❌ XPath 1.0 引擎(如旧版 libxml2、早期 Selenium)不识别这些函数,会报错。
在编程语言中预处理(推荐用于复杂场景)
当 XPath 表达式受限,或需匹配逻辑较复杂时(比如模糊匹配、正则、多条件组合),建议把大小写转换交给宿主语言:
-
Python(lxml):
from lxml import etree root = etree.parse("file.xml") elements = root.xpath("//element") result = [e for e in elements if e.get("attribute", "").lower() == "abc"] -
JavaScript(浏览器中):
[...document.querySelectorAll("element")].filter( el => el.getAttribute("attribute")?.toLowerCase() === "abc" );
✅ 灵活、可控、可调试;能结合正则、trim、空值判断等。
✅ 绕过 XPath 版本限制。
小技巧:用 CSS 选择器替代(仅限 HTML 场景)
如果是在网页自动化中(如 Selenium),且目标是 HTML 属性或文本,有时用 CSS + JavaScript 执行更简单:
# Selenium Python 示例
elements = driver.find_elements(By.XPATH, "//input")
matching = [el for el in elements if el.get_attribute("type").lower() == "submit"]或者用 document.evaluate 配合自定义函数(高级用法,略)。
基本上就这些。选哪种方式,主要看你的 XPath 引擎版本和实际运行环境。多数情况下,translate() 最保险;新项目优先考虑 lower-case();逻辑复杂时,交给代码处理反而更清晰。










