2010-08-05 31 views
18

Tôi muốn sử dụng "không" trong XPath đúng cách. Tôi dường như không thể làm cho nó hoạt động với các thuộc tính.Sử dụng not() trong XPath

Giả sử tôi có biểu thức này: //*[@name = 'Bob'] Nó hợp lệ và sẽ trả về tất cả các nút có thuộc tính tên bằng 'Bob'.

Bây giờ nếu tôi muốn tất cả các nút có thuộc tính tên không bằng 'Bob', tôi cần sử dụng XPath như: //*[@name not(='Bob')] nhưng điều này không hợp lệ.

Tôi đã thử nhiều kết hợp với không() được đặt theo thứ tự khác, nhưng dường như tôi không thể làm việc này. Ai đó có thể vui lòng thông báo cho tôi cách sử dụng không() đúng cách không?

Ngoài ra, đơn đặt hàng có thay đổi khi sử dụng các phần tử thay vì thuộc tính không? Chẳng hạn như: //name[text() = 'Bob']

Cảm ơn! :)

Trả lời

20

Theo: http://msdn.microsoft.com/en-us/library/ms256086.aspx, bạn đã thử

//*[@name != 'Bob'] 
+4

@mathieu: Tôi sẽ tốt hơn để trích dẫn các thông số kỹ thuật (không phải tài liệu MS), từ http: // www.w3.org/TR/xpath/#booleans * "Nếu một đối tượng được so sánh là tập hợp nút và nút kia là một chuỗi, thì phép so sánh sẽ đúng nếu và chỉ khi có nút trong nút- thiết lập sao cho kết quả thực hiện so sánh trên chuỗi giá trị của nút và chuỗi kia là true "* –

+0

@mathieu: Phương thức này làm việc cho các giá trị số nhưng không cho giá trị chuỗi. // * [@ numerical! = 1] hoạt động. // * [@ string! = "someString"] thì không. Chỉ có phần tử gốc đang được trả về! – developer

+0

@iHeartGreek: Bạn đã thử cái này chưa? Điều này là chính xác, bên cạnh các quot từ MS ... –

5

Hãy thử

//*[@name != 'Bob'] 

hoặc

//*[not(@name = 'Bob')] 

nên làm việc cả.

+0

Phương pháp này làm việc cho các giá trị số nhưng không phải cho các giá trị chuỗi. // * [@ numerical! = 1] hoạt động. // * [@ string! = "someString"] thì không. Chỉ có phần tử gốc đang được trả về! – developer

+0

Tôi khá chắc chắn rằng điều này sẽ làm việc cho chuỗi. Chắc chắn bạn không mắc lỗi, ví dụ, trường hợp sai? So sánh phân biệt chữ hoa chữ thường. –

+0

vâng tôi đã thử các tìm kiếm khác nhau. Tôi chỉ nhận được nút gốc được trả về. : S – developer

5
//*[@name and @name != 'Bob'] 
+0

Điều này không cung cấp tất cả các yếu tố cho dù chúng có @name hay không? Tôi cần nó là một phần tử với @name và sau đó có nó không bằng 'Bob' – developer

+0

OK được cập nhật để kiểm tra sự tồn tại của '@ name' –

+0

Tôi nghĩ rằng chỉ // * [@ name! = 'Bob'] sẽ hoạt động. như những người khác đã đề xuất. NHƯNG Phương pháp này hoạt động cho các giá trị số nhưng không hoạt động đối với các giá trị chuỗi. // * [@ numerical! = 1] hoạt động. // * [@ string! = "someString"] thì không. Chỉ có phần tử gốc đang được trả về! – developer

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