XPath查询滑块内/外图片及属性转换的技术问题求助
解决XPath筛选滑块内/外图片的问题
嘿,我看你在给jquery.lazy和jssor做图片属性转换的时候,卡在XPath的筛选逻辑上了,咱们一步步来解决这个问题:
先明确核心需求
你需要两类图片:
- 一类是在
embedded-slider-wrap类容器里的图片,要把src转成src2给jssor用 - 另一类是不在这个容器里的普通图片,要把
src转成data-src给jquery.lazy用
为什么你的原XPath失效了?
- 滑块图片查询失败:你用了
@class="embedded-slider-wrap"做精确匹配,如果这个div的class属性还有其他值(比如embedded-slider-wrap slider-theme),XPath就匹配不到了——实际开发中元素带多个class太常见了。 - 非滑块图片的NOT逻辑错误:你写的
ancestor::div/@class="embedded-slider-wrap"语法不对,ancestor::div是节点集合,得用谓词筛选出带目标class的节点,再判断是否存在这样的祖先。
正确的XPath写法
1. 匹配滑块内的图片
用contains()来匹配class属性,兼容多class场景,路径也更准确:
$imagesSlide = $xpath->query(sprintf('//div[@id="%s"]//div[contains(@class, "embedded-slider-wrap")]//img', $id));
如果你的embedded-slider-wrap永远是唯一的class(不会和其他class共存),也可以用精确匹配,但contains()的鲁棒性更强,推荐用它。
2. 匹配非滑块内的图片
修正NOT逻辑的写法,正确检查是否存在带目标class的祖先div:
$imagesOther = $xpath->query(sprintf('//div[@id="%s"]//img[not(ancestor::div[contains(@class, "embedded-slider-wrap")])]', $id));
这里的关键是把ancestor::div/@class="embedded-slider-wrap"改成ancestor::div[contains(@class, "embedded-slider-wrap")]——我们要找的是存在带有该class的祖先div,而不是直接比较属性值。
验证效果
用你提供的HTML结构测试:
$imagesSlide会匹配到1.jpg、2.jpg、4.jpg、5.jpg(所有滑块里的图片)$imagesOther会匹配到3.jpg(唯一的普通图片)
后续属性转换示例
拿到节点后,就可以分别处理属性了:
// 处理滑块图片:把src转成src2 foreach ($imagesSlide as $img) { $img->setAttribute('src2', $img->getAttribute('src')); $img->removeAttribute('src'); } // 处理普通懒加载图片:把src转成data-src foreach ($imagesOther as $img) { $img->setAttribute('data-src', $img->getAttribute('src')); $img->removeAttribute('src'); }
内容的提问来源于stack exchange,提问作者Mike Purcell
相关产品推荐
相关产品推荐

