XPath - 根据是否在指定范围内查询图片 div

XPath - Query images based on whether inside specified div

我们需要支持两个基于 jquery 的图像 api,jquery.lazy 处理普通图像的延迟加载,jssor 将多个图像转换为一个滑块,它有自己的滑块延迟加载图像的内部机制。为了完成这项工作,我们需要将每个图像的 src 属性转换为 data-src (jquery.lazy) 或 src2 (jssor).

html 看起来像这样:

<div id="campaign-content">
    <div id="slide-show-1" class="embedded-slider-wrap">
        <div>
             <img src="/path/to/1.jpg" />
        </div>
        <div>
             <img src="/path/to/2.jpg" />
        </div>
    </div>
    <figure>
         <img src="/path/to/3.jpg" />
    </figure>
    <div id="slide-show-2" class="embedded-slider-wrap">
        <div>
             <img src="/path/to/4.jpg" />
        </div>
        <div>
             <img src="/path/to/5.jpg" />
        </div>
    </div>
</div>

目标是发出两个 xpath 查询,一个用于 divs 内标记为滑块环绕(其中可能有多个)的所有图像,以及不包含在滑块内的所有图像-换行 div.

为了降低 xpath 查询的复杂性,我认为只查询幻灯片图像然后查询所有图像可能更容易,例如:

$imagesSlide = $xpath->query(sprintf('//div[@id="%s"]//div[@class="embedded-slider-wrap"]//img', $id));
$imagesOther = $xpath->query(sprintf('//div[@id="%s"]//img', $id));

然后逐一检查并设置正确的属性(data-src 或 src2)。我遇到的问题是,$imagesOther returns 所有图像的 xpath 查询(预期),而 $imagesSlide 的 xpath 查询没有。

此外,我尝试执行 NOT xpath 查询,这样我就不必对 ALL images 查询进行任何额外处理,但也无法使其按预期工作,它看起来像:

$images = $xpath->query(sprintf('//div[@id="%s"]//img[not(ancestor::div/@class="embedded-slider-wrap")]', $id));
$imagesSlide = $('.embedded-slider-wrap img')

//将其他图片包裹在div中,用class 'none-embedded-slider-wrap' //

$imagesOther = $('.none-embedded-slider-wrap img')

问题已解决。我以与处理 jquery 元素 selectors 相同的方式处理 xpath 查询。我在 OP 中没有提到的是 embedded-slider-wrap class 并不是唯一应用于 div 的 class(老实说我认为这并不重要 b/c jQuery 可以 select 个具有多个 class 的元素。

显然,如果元素有多个 class,则 XPath 不会匹配基于 class 名称的元素查询,相反,您必须执行以下操作:

// Element with multiple classes
<div class="embedded-slider-wrap some-other-class">
    <img src="/path/to/image/1.png" />

// Non working Xpath query
//img[ancestor::div[@class="embedded-slider-wrap"]]//img

// Working Xpath query
//img[ancestor::div[contains(@class, "embedded-slider-wrap")]]