2012-06-13 30 views
42

Tôi có một số XML có cấu trúc như thế này:Cách sử dụng không chứa() trong xpath?

<whatson> 
    <productions>  
    <production> 
     <category>Film</category> 
    </production> 
    <production> 
     <category>Business</category> 
    </production> 
    <production> 
     <category>Business training</category> 
    </production> 
    </productions> 
</whatson> 

Và tôi cần phải chọn từng sản xuất với một thể loại không chứa "Kinh doanh" (vì vậy chỉ cần sản xuất đầu tiên trong ví dụ này).

Điều này có thể thực hiện với xpath không? Tôi đã thử làm việc theo các dòng này nhưng không có nơi nào:

//production[not(contains(category,'business'))] 

Trả lời

79

Truy vấn XPath phân biệt chữ hoa chữ thường. Nhìn vào ví dụ của bạn (trong đó, bằng cách này, là tuyệt vời, không ai dường như cung cấp ví dụ nữa!), Tôi có thể nhận được kết quả bạn muốn chỉ bằng cách thay đổi "kinh doanh", để "kinh doanh"

//production[not(contains(category,'Business'))] 

tôi đã thử nghiệm điều này bằng cách mở tệp XML trong Chrome và sử dụng các công cụ dành cho nhà phát triển để thực thi các truy vấn XPath và nó đã cho tôi danh mục Phim trở lại.

24

tôi cần phải chọn từng sản xuất với một thể loại không chứa "Kinh doanh"

Mặc dù tôi upvoted @ câu trả lời Arran như đúng, tôi cũng sẽ thêm này ... giải thích đúng ra, đặc điểm kỹ thuật của OP sẽ được thực hiện như

//production[category[not(contains(., 'Business'))]] 

hơn

//production[not(contains(category, 'Business'))] 

Sau đó, chọn mọi sản xuất có trước tiêncategory trẻ em không chứa "Doanh nghiệp". Hai biểu thức XPath sẽ hoạt động khác nhau khi một số production không có số category trẻ em hoặc nhiều hơn một.

Nó không tạo ra bất kỳ sự khác biệt nào trong thực tế miễn là mỗi <production> có chính xác một số <category> con, như trong ví dụ XML ngắn của bạn. Cho dù bạn luôn có thể dựa vào đó là đúng hay không, phụ thuộc vào các yếu tố khác nhau, chẳng hạn như liệu bạn có một lược đồ thực thi ràng buộc đó hay không. Cá nhân, tôi sẽ đi cho các tùy chọn mạnh mẽ hơn, vì nó không "chi phí" nhiều ... giả định yêu cầu của bạn như đã nêu trong câu hỏi là thực sự chính xác (như trái ngược với ví dụ 'chọn tất cả các sản xuất mà không có một thể loại có chứa "Doanh nghiệp").

+0

@LoamyHound: Cảm ơn để sửa! Cuối cùng tôi đã nhìn thấy câu trả lời của bạn, và cố định các khung còn thiếu, hơn 2 năm sau đó. – LarsH

1

Bạn có thể sử dụng chức năng not(expression)

not() là một chức năng trong xpath (như trái ngược với một nhà điều hành)

Ví dụ:

//a[not(contains(@id, 'xx'))] 

HOẶC

expression != true() 
Các vấn đề liên quan