将XPATH谓词与位置相结合

时间:2011-02-10 18:54:28

标签: xpath predicate

我有一个div元素的集合,其中包含类media-gallery-item 我想选择元素编号x。

当选择所有项目时,我得到5个结果

$x("//div[@id='content-area']//div[@class='media-gallery-item']")

现在我希望能够选择第2项,但我无法弄清楚如何正确地合并这两项:

$x("//div[@id='content-area']//div[@class='media-gallery-item'][2]")

$x("//div[@id='content-area']//div[@class='media-gallery-item'
                                   and position() = 2]")

我知道这些并没有多大意义,因为它不是真正的AND,而更像是:“首先根据此过滤,然后选择第二场比赛”。 这样做的目的是继续选择内容(例如,在第二个元素中,获取href元素的a属性)

3 个答案:

答案 0 :(得分:11)

分步回答。

选择具有div[@id='content-area']祖先的元素,这是他们各自父母使用的第二个孩子:

//div[@id='content-area']//div[2]

选择使用div祖先的第二个(按文档顺序)div[@id='content-area']元素:

(//div[@id='content-area']//div)[2]

请注意区别。

然后,选择元素,这是他们各自父母的第二个孩子,提供他们有一个类'media-gallery-item'使用:

//div[@id='content-area']//div[2][@class='media-gallery-item']

选择元素,这些元素是那些具有类media-gallery-item的孩子(他们各自的父母)的第二个元素:

//div[@id='content-area']//div[@class='media-gallery-item'][2]

要选择具有div祖先的第二个(按文档顺序)div[@id='content-area']元素,请为其提供media-gallery-item类:

(//div[@id='content-area']//div)[2][@class='media-gallery-item']

从具有div祖先和div[@id='content-area']类的所有media-gallery-item元素中选择第二个(按文档顺序):

(//div[@id='content-area']//div)[@class='media-gallery-item'][2]
@Alejandro建议

规范引用

  

谓词过滤节点集   尊重轴以产生新的   节点集。对于每个节点   要过滤的节点集,   PredicateExpr用它进行评估   节点作为上下文节点,用   节点集中的节点数为   上下文大小,与附近   节点在节点集中的位置   相对于轴而言   背景位置

http://w3.org/TR/xpath/#predicates

  

成员的接近位置   相对于轴的节点集是   定义为节点的位置   在文档中排序的节点集中   如果轴是前轴,则排序   并按相反的文件顺序排序   如果轴是反转轴

http://w3.org/TR/xpath/#dt-proximity-position

底线是位置谓词相对于轴的作用。您需要括号来明确声明优先级。因此,在计算位置时,不会考虑child轴,而是在解析descendant-or-self轴之后的节点集。

答案 1 :(得分:0)

原来:括号!

(//div[@id='content-area']//div[@class='media-gallery-item'])[2] 

作品

答案 2 :(得分:0)

看起来您以错误的方式访问属性。尝试使用

/div[@id='content-area' and @class='media-gallery-item'][2]