2011-02-10 13 views
6

我有一個div類元素集合,其類media-gallery-item
我想選擇元素編號x。將XPATH謂詞與位置結合起來

當只是選擇的所有項目,我得到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屬性)

+0

恰在第一次重複中發現[如何使用XPath選擇最後N個元素?](http://stackoverflow.com/questions/458596/how-do-i-select-the- last-n-elements-with-xpath) – 2011-02-10 19:12:02

+0

這不是重複的。我想要一個特定的位置並將它與另一個謂詞結合起來。另一篇文章需要最後的n個項目(沒有其他謂詞,不是確切的位置) – 2011-02-12 13:39:06

回答

10

步驟一步的答案。

要選擇與div[@id='content-area']祖先元素,這是它們各自的父母的第二兒童的使用:

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

要選擇第二(按文檔順序)div元件與div[@id='content-area']祖先使用:

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

請注意區別。

然後,選擇元素,這是他們各自父母的第二個孩子的,只要他們有一類「媒體庫項目」使用:

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

選擇元素,它們是從第二那些具有類media-gallery-item兒童的(各自的父母):

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

要選擇第二(按文檔順序)與div[@id='content-area']祖先div元件,提供具有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

的成員的接近位置0相對於軸的節點集合爲 ,其定義爲節點集合中的節點集合 在文檔 中排序的位置,如果該軸是前向軸 且以反向文檔順序排列,如果軸是軸

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

底線的反向是,位置謂詞工作相對於所述軸線。你需要括號來明確地聲明優先級。因此軸不是child,但是在計算位置時將考慮解析descendant-or-self軸後的節點集。

0

事實證明:括號!

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

工作

+0

您也可以檢查我的答案以獲得完整分析。 – Flack 2011-02-10 19:13:57

0

它看起來像您以錯誤的方式訪問屬性。嘗試使用

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