2010-04-20 3 views
9

içermeyen öğeleri seçmek için bir xpath inşa, ama tersi sonuçla, yani metinde (default) içermeyen öğeler.nasıl bir dize aşağıda örneğe benzer bir şey kullanın yapmak nasıl

<test> 
    <item>Some text (default)</item> 
    <item>Some more text</item> 
    <item>Even more text</item> 
</test> 

bu

//test/item[contains(text(), '(default)')] 

ilk öğeyi dönecekti Verilen. İçerisinde kullanabileceğim bir operatör yok mu?

cevap

17

Evet, var:

//test/item[not(contains(text(), '(default)'))]

İpucu: not() XPath'de bir işlev yerine bir operatörüdür. Bu ifade etmek


alternatif muhtemelen daha iyi yoludur: İki ifadeleri arasında ince ama önemli bir fark vardır

//test/item[not(text()[contains(., '(default)')])]

(en sırasıyla A ve B diyelim).

Basit durum: Tüm <item> yalnızca tek bir metin düğümü çocuğuna sahipse, hem A hem de B davranır.

Kompleks durum: '(default)' Bunlardan ilk oluştuğunda<item> Eğer birden metin düğümü çocuk sahibi olabilir, ifade bir tek eşleşir.

text() maçları tüm metin düğümü çocukları ve bir düğüm kümesi üretir olmasıdır. Şimdiye kadar sürpriz yok. Şimdi, bir ilk argüman olarak düğüm kümesindeki kabul eder; ancak işini yapması dizeye dönüştürmek gerekiyor. Ve düğüm kümesi dizeye sadece sette ilk düğümün dize değerini üreten dönüşüm gelen diğer tüm düğümler (ne demek istediğimi görmek için string(//item) deneyin) dikkate alınmaz. Basit bir durumda bu yanı olur tam olarak ne, ama sonuç olarak şaşırtıcı değildir. Açıkça her metin düğümü kontrol bireysel yerine yalnızca tam <item> elemanın dize değeri denetleyerek bu konuda

İfade B fırsatlar. Bu nedenle, bu ikisinin daha sağlam.