Xpath表达式根据子节点的存在选择节点?

时间:2014-01-13 04:35:08

标签: html xml xpath

我正在尝试使用Xpath查找具有给定CSS类(.product)的所有<div>

<div class="product">
    <a href="#product/1966740"><img class="cover_image" src="https://foobar.JPG" alt="foobar" title="foobar">
    <h3>foobar</h3></a>
    <div class="price">$66.00</div>
    <div class="rrp">$219.11</div>
</div>

所以找到这些的Xpath相对简单:

//div[@class="product"]

但是,我只想找到那些没有售罄的产品。售罄的产品看起来像这样:

<div class="product">
    <img class="availability" src="https://sold_out_tag.png" alt="sold out">
    <a href="#product/1963553"><img class="cover_image" src="foobar.jpg" alt="foobar" title="foobar">
    <h3>FooBar<h3></a>
    <div class="price">$40.00</div>
    <div class="rrp">$129.33</div>
</div>

我原以为我可以使用not(),并检查不包含<div>且{alt}属性设置为“已售罄”的<img>

但是,以下内容无效:

//div[@class="product" and not([img[@alt="sold out"]])]

有关如何使这项工作的任何想法?

干杯, 维克多

3 个答案:

答案 0 :(得分:0)

使用此XPath:

//div[@class="product" and not(img[@alt="sold out"])]

答案 1 :(得分:0)

你快到了。 []子路径周围不需要img

//div[@class="product" and not(img[@alt = "sold out"])]

编写基本相同的东西的另一种方法是:

//div[@class="product" and not(img/@alt = "sold out")]

最后,由于class属性可以包含多个类,因此通常最好使用contains()来检查类:

//div[contains(concat(' ', @class, ' '), " product ") and not(img/@alt = "sold out")]

答案 2 :(得分:0)

你犯了一个小错误

// div [@ class =“product”] / img [@alt!=“售罄”]