本文介绍如何用单条 xpath 表达式实现“优先匹配某条件,若无结果则回退到另一条件”的逻辑,避免 javascript 多次调用 `document.evaluate`,提升简洁性与性能。
在 XPath 中,要实现“先尝试匹配 //*[@selected]/@value,若无结果再取 //text() 的第一个匹配项”,关键在于理解 文档顺序(document order) 与 节点集合并与截取 的行为。
最简洁、标准且兼容性良好的写法是:
(//*[@selected]/@value | //text())[1]
✅ 原理说明:
之前),自然被优先选中;反之,若无匹配的 @value,则第一个 //text() 节点将作为最终结果。⚠️ 注意事项:
✅ 推荐封装(JavaScript 一行调用):
function xpathFirst(path) {
const result = document.evaluate(
path,
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
);
return result.singleNodeValue?.nodeValue || result.singleNodeValue?.value || null;
}
// 使用示例:
const value = xpathFirst('(//*[@selected]/@value | //text())[1]');总结:用 (A | B)[1] 是 XPath 实现轻量级条件回退的标准实践,兼顾简洁性、可读性与浏览器兼容性(原生支持 XPath 1.0)。当业务逻辑复杂度上升时,再考虑升级至 XPath 3.1 或辅以脚本控制流。