2013-06-11 39 views
40

Tôi có tài liệu sau:Cách chọn nút bằng XPath nếu nút anh chị em có giá trị cụ thể?

<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> sử dụng XPath nếu <bb>zz?

+1

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

Trả lời

19

gì bạn cần là following-sibling trục XPath

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

thử XPath đây: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625

+0

cảm ơn, đây là những gì tôi đang tìm kiếm. –

+0

cảm ơn câu trả lời –

+4

@HOESENGKIANG: bạn nên nhấp vào dấu kiểm để "chấp nhận" câu trả lời này hoặc bất kỳ câu trả lời nào bạn nghĩ sẽ trả lời câu hỏi tốt nhất. – LarsH

3

Trước hết, ví dụ của bạn được tạo không đúng XML. Nhìn ra điều đó và rằng bạn đã không diễn tả ý đồ của bạn rất tốt (chính xác gì làm bạn muốn chọn theo điều kiện nào?), Tôi giả sử 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() 

Hãy nhìn vào the spec, nó có một số rất tốt có thể đọc được examples từ đó bạn sẽ học được rất nhiều.

+1

+1 - giải thích là hữu ích. – LarsH

+1

@LarsH Cảm ơn bạn đã sửa từ "không hợp lệ" thành "không được định dạng đúng". Tôi đã học được một cái gì đó mới ngày hôm nay. –

10

Q: Cách chọn nút bằng XPath nếu nút anh chị em có giá trị cụ thể? '
Vì chỉ có "XPath Axes" cho người anh 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 sửa chữa.
Nhưng tốt hơn:
Look cho cc là phụ huynh có con bb với giá trị 'zz':

//cc[../bb='zz']" 
+6

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

+0

Không chắc chắn ý của bạn là "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ó trục duy nhất cho tất cả anh chị em? – LarsH

+0

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

59

Không chắc lý do tại sao tất cả mọi người được truy vấn cho anh chị em, bạn cũng có thể kiểm tra <bb/> -elements phù hợp với vị từ <a/> 's ngữ:

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

cảm ơn, rất hiệu quả. –

+7

* "Không chắc tại sao mọi người lại truy vấn cho anh chị em "*: Có lẽ vì câu hỏi dành cho anh chị em .. ;-) –

+4

Dường như tôi thực sự không đọc tiêu đề. :) Câu trả lời vẫn hợp lệ. –

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

// a: Chọn tất cả 'a' yếu tố bất kể nó được.

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

..: Chọn phụ huynh của nút hiện tại.

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

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

Các vấn đề liên quan