2011-01-07 44 views
21

Tài liệu XML:Toán tử XPath "! =". Làm thế nào nó hoạt động?

<doc> 
    <A> 
     <Node>Hello!</Node> 
    </A> 

    <B>  
     <Node/> 
    </B> 

    <C> 
    </C> 

    <D/> 
</doc> 

Bạn đánh giá các truy vấn XPath sau đây như thế nào?

/doc/A/Node != 'abcd' 
/doc/B/Node != 'abcd' 
/doc/C/Node != 'abcd' 
/doc/D/Node != 'abcd' 

Tôi mong chờ ALL trong số này để đánh giá để đúng.

Tuy nhiên, đây là kết quả:

/doc/A/Node != 'abcd'  true 
/doc/B/Node != 'abcd'  true 
/doc/C/Node != 'abcd'  false 
/doc/D/Node != 'abcd'  false 

là hành vi mong đợi này? Hay là một lỗi với nhà cung cấp XPath của tôi (jaxen)?

+0

Câu hỏi hay, +1. Xem câu trả lời của tôi cho một lời giải thích và "phải nhớ" quy tắc và giải pháp.:) –

Trả lời

1

Từ XPath spec:

Nếu một đối tượng được so sánh là một nút thiết lập và người kia là một chuỗi, sau đó so sánh sẽ là đúng nếu và chỉ nếu có một nút trong node- 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à đúng.

Điều này có nghĩa là nếu tập hợp nút trống (như trong trường hợp C và D), kết quả của biểu thức boolean sẽ là sai, vì không có nút nào có thể áp dụng.

Bạn có thể làm việc xung quanh hành vi này và nhận được kết quả mà bạn muốn sử dụng một biểu thức như:

count(/doc/C/Node) = 0 or /doc/C/Node != 'abcd' 
+1

+1 Tốt để trích dẫn thông số -1 Không hợp lệ cho đề xuất ... –

42

Khuyến nghị: Không bao giờ sử dụng toán tử != để so sánh sự bất bình đẳng mà một hoặc cả hai đối số là nút-bộ.

By definition biểu thức:

$node-set != $value 

đánh giá để true() chính xác khi có ít nhất một nút trong $node-set sao cho giá trị chuỗi của nó không phải là tương đương với giá trị chuỗi của $value.

Sử dụng định nghĩa này:

$empty-nodeset != $value 

luôn là false(), bởi vì thậm chí không có một nút duy nhất trong $empty-nodeset mà sự bất bình đẳng giữ.

Giải pháp:

Sử dụng:

not($node-set = $value) 

Sau đó, bạn sẽ có được tất cả các kết quả true(), như muốn.

+0

+1. Mẹo này đã giúp tôi tiết kiệm rất nhiều thần kinh. – Flack

+0

+1 Biểu thức chính xác. –

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