2011-01-07 24 views
21

XML belgesi:XPath operatörü "! =". O nasıl çalışır?

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

    <B>  
     <Node/> 
    </B> 

    <C> 
    </C> 

    <D/> 
</doc> 

Nasıl aşağıdaki XPath sorguları değerlendirirsiniz?

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

Ben gerçek için değerlendirmek için bunlardan TÜM beklenebilir.

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

bu beklenen davranış mı:

Ancak burada sonuçlarıdır? Yoksa XPath sağlayıcım (jaxen) ile bir hata mı? Gönderen

+0

İyi soru, +1. Cevabımı bir açıklama ve "hatırlamanız gereken" kural ve çözüm için bakın.:) –

cevap

1

XPath spec: karşılaştırılacak bir nesnedir

Bir düğüm kümesi hem de nod bir düğüm vardır ancak ve ancak diğer bir dize, karşılaştırmanın doğru olacaktır karşılaştırmayı düğümün dize değerinde ve diğer dizede gerçekleştirmenin sonucu doğru olacak şekilde ayarlayın.

Bu düğüm-kümesi (sizin vakalar C ve D gibi) boşsa eşitsizlik uygulayabileceğiniz için hiçbir düğüm olduğundan, boolean ifadenin sonucu yanlış olacağı anlamına gelir.

Bu davranışa geçici bir çözüm ve benzeri bir ifade kullanarak istediğiniz sonucu alabilirsiniz:

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

+1 Ürünü tavsiye etmek için tavsiye ederiz - Öneri için en kötü ... –

42

Öneri: bir veya her iki argüman düğüm kümelerinin nerede eşitsizlik karşılaştırmak için != operatörü kullanmayın.

By definition sentezleme: dize değeri $value dize değerine eşit değildir $node-set gibi en az bir düğüm tam olarak ne zaman

$node-set != $value 

true() olarak değerlendirilir. eşitsizlik tutan için $empty-nodeset tek düğüm bile olmadığından

$empty-nodeset != $value 

, daima false() şudur: Bu tanım kullanma

.

Çözüm:

Kullanım: istediği gibi

not($node-set = $value) 

Sonra, Tüm sonuçları true() olsun.

+0

+1. Bu bahşiş bana çok fazla sinir kazandırdı. – Flack

+0

+1 Doğru ifade. –