2008-09-19 28 views
124

Với XML này, những gì XPath trả về tất cả các yếu tố mà prop thuộc tính chứa Foo (ba nút đầu tiên):XPath chính xác để chọn thuộc tính chứa "foo" là gì?

<bla> 
<a prop="Foo1"/> 
<a prop="Foo2"/> 
<a prop="3Foo"/> 
<a prop="Bar"/> 
</bla> 
+1

Tại sao mọi người nhìn vào thuộc tính "chống đỡ"? Tôi đã bỏ lỡ một cái gì đó? Nó chỉ nói có được ba nút đầu tiên. –

+3

Mọi người đều nhìn vào thuộc tính chống đỡ bởi vì đó là những gì được hỏi. Nhận tất cả các nút nơi prop chứa "Foo". Thêm và bạn sẽ thấy lý do tại sao nó không chỉ là "ba nút đầu tiên" .. – erlando

+0

Câu hỏi trong phần nội dung kém được viết, bất kể tiêu đề. Có thể foo thực sự ở trong bất kỳ thuộc tính chống đỡ nào, hay bạn nghiêm túc chỉ muốn ba nút đầu tiên? –

Trả lời

223
//a[contains(@prop,'Foo')] 

trình nếu tôi sử dụng XML này để có được kết quả trở lại.

<bla> 
<a prop="Foo1">a</a> 
<a prop="Foo2">b</a> 
<a prop="3Foo">c</a> 
<a prop="Bar">a</a> 
</bla> 

Trang web này là rất tốt cho thử nghiệm loại điều

http://www.xmlme.com/XpathTool.aspx

Edit: Một điều cần lưu ý là trong khi XPath trên sẽ trả lại câu trả lời chính xác cho rằng xml Đặc biệt, nếu bạn muốn đảm bảo bạn chỉ nhận được các yếu tố "a" trong phần tử "blah", bạn nên như những người khác đã đề cập cũng sử dụng

/bla/a[contains(@prop,'Foo')] 

này sẽ tìm kiếm tất cả các bạn "a" các yếu tố trong toàn bộ tài liệu XML của mình, không phân biệt được lồng trong một "blah" yếu tố

//a[contains(@prop,'Foo')] 

tôi thêm này vì lợi ích của triệt để và theo tinh thần của stackoverflow. :)

+1

'xmlme.com' hiện chuyển hướng đến một số máy chủ khác và không xuất hiện để lưu trữ công cụ hoặc bất cứ điều gì giống như nó. – jpmc26

4

Các bạn đã thử một cái gì đó như:

// a [chứa (@prop " foo ")]

tôi chưa bao giờ sử dụng các chức năng chứa trước nhưng nghi ngờ rằng nó sẽ hoạt động như quảng cáo ...

+0

@toddk ... bạn đã nhắm mục tiêu một thuộc tính không tồn tại: @foo. Bạn muốn nhắm mục tiêu @prop ;-) –

2

/bla/a [chứa (@prop, "foo")]

1

Đối với các mã trên ... // * [chứa (@ prop, 'foo')]

+0

điều này là cho bất kỳ phần tử nào có foo, nhưng thuộc tính phải là "prop" – digiguru

1

thử điều này:

// a [chứa (@ prop, 'foo') ]

rằng nên làm việc cho bất kỳ "một" thẻ trong tài liệu

5

John C là gần nhất, nhưng XPath là trường hợp nhạy cảm, do đó XPath đúng sẽ là:

/bla/a[contains(@prop, 'Foo')] 
14
descendant-or-self::*[contains(@prop,'Foo')] 

Hoặc:

/bla/a[contains(@prop,'Foo')] 

Hoặc:

/bla/a[position() <= 3] 

Đã giải phóng:

descendant-or-self:: 

Trục - tìm kiếm qua mọi nút bên dưới và chính nút đó. Nó thường là tốt hơn để nói điều này hơn //. Tôi đã gặp phải một số triển khai trong đó // có nghĩa là bất cứ nơi nào (bị đơn hoặc tự của nút gốc). Người kia sử dụng trục mặc định.

* or /bla/a 

Thẻ - đối sánh ký tự đại diện và/bla/a là đường dẫn tuyệt đối.

[contains(@prop,'Foo')] or [position() <= 3] 

Điều kiện trong []. @prop là viết tắt của thuộc tính :: prop, vì thuộc tính là một trục tìm kiếm khác. Hoặc bạn có thể chọn 3 đầu tiên bằng cách sử dụng hàm position().

18

XPath này sẽ cung cấp cho bạn tất cả các nút có các thuộc tính chứa 'Foo' bất kể tên nút hoặc tên thuộc tính:

//attribute::*[contains(., 'Foo')]/.. 

Tất nhiên, nếu bạn đang quan tâm nhiều hơn trong các nội dung của thuộc tính bản thân, và không nhất thiết phải nút cha của họ, chỉ việc kéo thả/..

//attribute::*[contains(., 'Foo')] 
+0

câu trả lời phổ biến nhất – aliopi

+0

Đối với tất cả các nút '// @ * [contains (., 'Foo')]' – aliopi

3

Nếu bạn cũng cần phải phù hợp với nội dung của liên kết chính nó, sử dụng văn bản():

//a[contains(@href,"/some_link")][text()="Click here"]

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