Làm thế nào để chọn một nút bằng XPath nếu nút anh chị em có một giá trị cụ thể?


88

Tôi có tài liệu sau:

<a>
  <bb>abc</bb>
  <cc>ccc</cc>
  <dd>ddd</dd>
</a>
<a>
  <bb>zz</bb>
  <cc>1</cc>
  <dd>2</dd>
</a>

Làm thế nào tôi có thể nhận được giá trị của <cc>việc sử dụng XPath nếu <bb>zz?


1
vấn đề là tôi biết cách truy cập vào một nút cụ thể, nhưng tôi không biết cách truy cập vào một nút nếu một anh chị em có giá trị cụ thể. Nó có thể giống như thế này / a / cc / chứa (/ a / bb = 'zz') không?
HOE SENGKIANG

Câu trả lời:


99

Không chắc tại sao mọi người lại truy vấn anh chị em, bạn cũng có thể kiểm tra các thành phần <bb/>-elements khớp với vị từ từ <a/>vị ngữ của:

//a[bb/text() = "zz"]/cc/text()

23
"Không chắc lý do tại sao tất cả mọi người được truy vấn cho anh chị em" : Có lẽ vì câu hỏi đã cho anh chị em .. ;-)
hr_117

4
Có vẻ như tôi thực sự đã không đọc tiêu đề. :) Câu trả lời vẫn có giá trị.
Jens Erat

2
Câu trả lời của bạn truy vấn cho anh chị em quá. Bạn chỉ không sử dụng một *-siblingtrục. +1 mặc dù.
LarsH

Điều này không trả lời câu hỏi nhưng nó trả lời câu hỏi thực tế của tôi mà tôi đã xây dựng sai. Cảm ơn bạn!
Người dùng9213


23

Hỏi: Làm thế nào để chọn một nút bằng XPath nếu nút anh chị em có một giá trị cụ thể?
Bởi vì chỉ có "XPath Axes" cho anh chị em sau và anh chị em trước, bạn có thể sử dụng một trong số chúng nếu vị trí được cố định.

Nhưng tốt hơn: Hãy tìm kiếm ccphụ huynh có con bbcó giá trị 'zz':

//cc[../bb='zz']

6
Hoặc là hoặc //a[bb = 'zz']/cc.
Tomalak

Không chắc bạn có nghĩa là gì khi 'chỉ "XPath Axes" cho anh chị em sau và anh chị em trước'. Bạn đang đề cập đến thực tế là không có một trục duy nhất cho tất cả anh chị em?
LarsH

@LarsH: Vâng xin lỗi, (xin lỗi tiếng Anh xấu của tôi :-() - đó là những gì tôi đã cố gắng để nói. (Bởi vì câu hỏi đã cho anh chị em.)
hr_117

6

Trước hết, ví dụ của bạn không phải là XML được định dạng tốt. Nhìn ra điều đó và bạn không mô tả ý định của mình tốt lắm (Bạn muốn chọn chính xác điều gì với điều kiện nào?), Tôi cho rằng bạn muốn làm điều này:

//cc[preceding-sibling::bb[text()="zz"]]/text()

Nó chọn

TEXT VALUES OF ALL <CC> ELEMENTS
//cc                                    /text()
    THAT HAVE A PRECEDING SIBLING <BB>
    [preceding-sibling::bb             ]
                          THAT HAS TEXT VALUE EQUAL TO "zz"
                          [text()="zz"]

Bạn có thể viết cũng như

//bb[text()="zz"]/following-sibling::cc/text()

Vui lòng nhìn vào thông số kỹ thuật , nó có một số ví dụ rất dễ đọc mà từ đó bạn sẽ học được rất nhiều.


1
@LarsH Cảm ơn bạn đã sửa từ "không hợp lệ" thành "không đúng". Tôi đã học được điều gì đó mới hôm nay.
Petr Janeček

4
//a/cc[../bb='zz']/text()

// a: Chọn tất cả các phần tử 'a' bất kể nó ở đâu.

// a / cc: Chọn các phần tử 'cc' là con của phần tử 'a' (bất kể a ở đâu).

..: Chọn nút cha của nút hiện tại.

[../bb='zz ']: trong đó giá trị của phần tử' bb 'anh chị em là zz.

Tham khảo: http://www.w3schools.com/xsl/xpath_syntax.asp


4

Một giải pháp khác cho vấn đề này là

//bb[contains(.,'zz')]/../cc/text()

Giải thích : Bất kỳ chuỗi nào bbchứa 'zz'chuỗi trong tất cả các nút con bbsau đó sẽ đến nút cha của nút đó bbbằng cách sử dụng .., bây giờ chúng ta có thể truy cập ccvăn bản trả về như vậy.

Tôi hy vọng lời giải thích đó không phức tạp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.