XPath 表达式中实现条件优先匹配:获取首个满足任一条件的节点

发布时间 - 2025-12-31 00:00:00    点击率:

使用 xpath 表达式 `(//*[@selected]/@value|//text())[1]` 可简洁实现“优先匹配 `@selected` 属性值,不存在时回退到任意文本节点”的逻辑,无需 javascript 多次调用 `evaluate`。

在 XPath 中,| 运算符用于合并多个节点集,其结果是按文档顺序(document order)去重并排序后的节点集合。因此,(//*[@selected]/@value|//text())[1] 的含义是:

  • 先收集所有满足 //*[@selected]/@value 的属性节点(即任意位置带 selected 属性的元素的 value 值);
  • 再收集所有 //text() 文本节点;
  • 将二者合并为一个节点集,并按 HTML/XML 文档中实际出现顺序排列;
  • 最后取第一个节点([1])——这天然保证了:若存在 @selected 对应的 @value,且它在文档中早于所有 //text() 节点,则返回它;否则返回文档中最靠前的文本节点。

✅ 正确示例(HTML 片段):

Normal

fallback text

执行 (//*[@selected]/@value|//text())[1] 将返回 "primary"(来自 的 value 属性),因其节点在文档中位于 fallback text 之前。

⚠️ 注意事项:

  • [1] 作用于整个联合结果集,不是分别对左右两侧取 [1](区别于某些误解);
  • //text() 匹配所有文本节点(包括空白、换行),如需更精确控制,建议限定为非空文本://text()[normalize-space()];
  • 若需支持更复杂的多级 fallback(如 A → B → C),XPath 2.0+ 可用序列构造器配合 ? 安全调用(如 SaxonJS 中):
    (//*[@selected]/@value, //*[contains(@class,'main')]/@data-id, //title/text())[1]
  • 浏览器原生 document.evaluate() 仅支持 XPath 1.0,不支持逗号序列语法(如 (A,B)[1]),因此推荐使用 (A|B)[1] 形式以确保兼容性;若需 XPath 3.1 功能(如函数式 fallback),可引入 SaxonJS。

? 总结:用 (expr1|expr2)[1] 替代多次 evaluate 调用,既简洁又高效,是 XPath 条件优先匹配的经典实践。


# javascript  # java  # html  # js  # 浏览器  # ai  # 区别  # 排列 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: IOS倒计时设置UIButton标题title的抖动问题  b2c电商网站制作流程,b2c水平综合的电商平台?  网站制作免费,什么网站能看正片电影?  如何将凡科建站内容保存为本地文件?  PHP 500报错的快速解决方法  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  北京网站制作公司哪家好一点,北京租房网站有哪些?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  如何用PHP快速搭建CMS系统?  如何在香港服务器上快速搭建免备案网站?  EditPlus 正则表达式 实战(3)  三星、SK海力士获美批准:可向中国出口芯片制造设备  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  ,网页ppt怎么弄成自己的ppt?  js实现获取鼠标当前的位置  如何快速生成橙子建站落地页链接?  Python图片处理进阶教程_Pillow滤镜与图像增强  Python3.6正式版新特性预览  Laravel如何创建自定义Artisan命令?(代码示例)  如何在云主机上快速搭建网站?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  iOS正则表达式验证手机号、邮箱、身份证号等  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  如何实现建站之星域名转发设置?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  js实现点击每个li节点,都弹出其文本值及修改  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  Laravel怎么在Controller之外的地方验证数据  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  jQuery中的100个技巧汇总  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  原生JS获取元素集合的子元素宽度实例  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  如何在IIS中新建站点并解决端口绑定冲突?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】