xpath
  • predicate
  • 2011-02-10 35 views 6 likes 
    6

    Tôi có tập hợp các phần tử div có lớp media-gallery-item.
    Tôi muốn chọn số phần tử x.Kết hợp vị từ XPATH với vị trí

    Khi chỉ chọn tất cả các mục, tôi nhận được 5 kết quả

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

    Bây giờ tôi muốn để có thể chọn mục số 2, nhưng tôi không thể tìm ra cách để kết hợp hai đúng:

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

    Tôi biết những điều này không có ý nghĩa nhiều vì nó không thực sự là AND, nhưng giống như: "lọc theo điều này trước tiên, sau đó chọn kết quả phù hợp thứ 2". Mục tiêu của việc này là tiếp tục chọn mọi thứ (ví dụ: trong phần tử thứ hai, hãy cho tôi thuộc tính href của phần tử a)

    +0

    Chỉ tìm thấy bản sao đầu tiên [Làm cách nào để chọn các phần tử N cuối cùng với XPath?] (Http://stackoverflow.com/questions/458596/how-do-i-select-the- last-n-elements-with-xpath) –

    +0

    Đó không phải là bản sao. Tôi muốn một vị trí cụ thể và kết hợp nó với một vị từ khác. Bài viết khác muốn n mục cuối cùng (không có vị ngữ khác, không phải vị trí chính xác) –

    Trả lời

    10

    Step-by-step câu trả lời.

    Để chọn phần tử với một tổ tiên div[@id='content-area'], đó là những Childs thứ hai của cha mẹ mình sử dụng:

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

    Để chọn thứ hai (theo thứ tự tài liệu) div phần tử với một sử dụng div[@id='content-area'] tổ tiên:

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

    Lưu ý sự khác biệt.

    Sau đó, để chọn các yếu tố, đó là Childs thứ hai của cha mẹ của mình, cung cấp họ có một lớp 'phương tiện truyền thông-gallery-item' sử dụng:

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

    Để chọn các yếu tố, đó là lần thứ hai từ những Childs (cha mẹ của mình) mà có một lớp media-gallery-item:

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

    Để chọn thứ hai (theo thứ tự tài liệu) div phần tử với một tổ tiên div[@id='content-area'], cung cấp nó có media-gallery-item lớp:

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

    Để chọn thứ hai (theo thứ tự tài liệu) từ khắp nơi div phần tử với một tổ tiên div[@id='content-area'] và một lớp media-gallery-item:

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

    Spec trích theo đề nghị của @Alejandro:

    Vị từ bộ lọc tập hợp nút có liên quan đến trục để tạo mới bộ nút.Đối với mỗi nút trong bộ nút được lọc, PredicateExpr được đánh giá bằng nút làm nút ngữ cảnh, với số lượng nút trong bộ nút làm kích thước ngữ cảnh và với khoảng cách vị trí của nút trong nút thiết lập liên quan đến trục như vị trí bối cảnh

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

    vị trí gần nhau của một thành viên của bộ nút đối với trục là được xác định là vị trí của nút trong bộ nút được đặt hàng trong tài liệu đặt hàng nếu trục là trục tiến và được đặt theo thứ tự tài liệu đảo ngược nếu trục một đảo ngược trục

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

    Điểm mấu chốt là vị trí vị làm việc so với trục với. Và bạn cần dấu ngoặc đơn để khai báo một cách rõ ràng mức độ ưu tiên. Do đó không phải là trục child, nhưng tập hợp nút sau khi giải quyết trục descendant-or-self sẽ được xem xét, khi tính toán vị trí.

    +0

    Câu trả lời hay, +1 –

    +1

    @Alejandro, dấu ngoặc kép quen thuộc ngay bây giờ :) Tôi sẽ thêm chúng vào câu trả lời. – Flack

    +0

    Bây giờ là một câu trả lời hoàn chỉnh! –

    0

    Biến ra: dấu ngoặc đơn!

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

    làm việc

    +0

    Bạn cũng có thể kiểm tra câu trả lời của tôi để có một phân tích đầy đủ. – Flack

    0

    Dường như thuộc tính truy cập của bạn theo cách sai. Hãy thử sử dụng

    /div[@id='content-area' and @class='media-gallery-item'][2] 
    
    Các vấn đề liên quan