这是针对XPath 1.0的。如果您的环境支持XPath 2.0,请参见此处。
是的,可以实现,但不够优雅。
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
这将适用于预先知道字母表的搜索字符串。添加您希望看到的任何重音字符。
如果可以的话,在构建HTML时,使用其他方法标记您感兴趣的文本,例如将其包含在具有特定类的
<span>
中。这些内容比元素文本中的子字符串更容易使用XPath定位。
如果这不是选项,则可以让JavaScript(或任何其他用于执行XPath的宿主语言)帮助您构建动态XPath表达式:
function xpathPrepare(xpath, searchString) {
return xpath.replace("$u", searchString.toUpperCase())
.replace("$l", searchString.toLowerCase())
.replace("$s", searchString.toLowerCase());
}
xp = xpathPrepare("//text()[contains(translate(., '$u', '$l'), '$s')]", "Test");
(感谢@KirillPolishchuk的回答 - 当然,你只需要翻译你实际搜索的字符。)
这种方法适用于任何搜索字符串,而无需事先了解字母表,这是一个很大的优势。
当搜索字符串可以包含单引号时,上述两种方法都会失败,在这种情况下,事情变得更加复杂。
translate()
本身并不关心您重复每个字符的次数-translate(., 'EE', 'ee')
与translate(., 'E', 'e')
完全等效。附言:别忘了给@KirillPolishchuk点赞,这个想法是他提出的。 - Tomalak