【问题标题】:Combine XPATH predicate with position将 XPATH 谓词与位置相结合
【发布时间】:2011-02-10 18:54:28
【问题描述】:

我有一组具有 media-gallery-item 类的 div 元素。
我想选择元素编号 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,但更像是:“首先根据此过滤,然后选择第二个匹配项”。 这样做的目的是继续选择事物(例如,在第二个元素中,获取 a 元素的 href 属性)

【问题讨论】:

  • 只是找到的第一个副本How do I select the last N elements with XPath?
  • 那不是重复的。我想要一个特定的位置并将它与另一个谓词结合起来。另一个帖子想要最后 n 项(没有其他谓词,不是确切位置)

标签: xpath predicate


【解决方案1】:

一步一步的回答。

要选择具有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[@id='content-area'] 祖先和media-gallery-item 类的div 元素中选择第二个(按文档顺序):

(//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轴后的节点集。

【讨论】:

  • @Alejandro,现在熟悉的引号 :) 我会将它们添加到答案中。
【解决方案2】:

原来:括号!

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

作品

【讨论】:

  • 您也可以查看我的答案进行完整分析。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    相关资源
    最近更新 更多