2014-01-13 125 views
0

我正在尝试使用Xpath查找具有给定CSS类(.product)的所有<div>Xpath Expression根据子节点的存在选择节点?

<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> 

我想我可以用不(),并检查不以设置为“售罄” alt属性包含<img><div>秒。

但是,下面是无效:

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

如何得到这个工作有什么想法?

干杯, 维克多

回答

0

你是几乎没有。你不需要[] S周围的img子路径:

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

另一种方式来写本质上是相同的事情是:

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

最后,由于class属性可以包含多个类,它往往是更好地使用检查类:

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

很酷,这个很有效! =)问题 - 你说我不需要[] - XPath如何知道我要求它检查是否存在子节点?其次,@class与空格的连接是什么?最后 - 你会推荐给XPath的任何优秀指南? – victorhooi

+0

(1)'not()'在执行评估之前将其内容转换为布尔值。如果这些内容是节点集表达式,则布尔值如果节点集为空则为“假”,如果非空则为“真”。 (2)空格防止由于类名的部分匹配而导致的误报。例如,'contains('not-a-product','product')'将评估为'true',而'concains'('not-a-product','product')'评估为false,如预期的。 (3)我可以给出的最好建议是阅读[XPath规范](http://www.w3.org/TR/xpath/)以及练习,练习和练习。 – JLRishe

0

使用这个XPath:

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

你是一个小错误,应该是

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

+0

这在多个方面都不正确。 – JLRishe