2012-06-13 13 views
42

Mam XML, który jest zorganizowany tak:Jak używać nie zawiera() w ścieżce xpath?

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

I muszę wybrać każdą produkcję z kategorii, która nie zawiera „biznesowy” (tak właśnie pierwszą produkcję w tym przykładzie).

Czy to możliwe z xpath? Próbowałem pracować zgodnie z tymi liniami, ale nigdzie nie osiągnąłem:

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

Odpowiedz

79

W zapytaniach XPath rozróżniana jest wielkość liter. Spojrzeliśmy na swoim przykładzie (który, nawiasem mówiąc, jest niesamowite, nikt nie wydaje się przykłady już!), Można uzyskać efekt chcesz po prostu przez zmianę „biznes”, na „biznesowy”

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

I przetestowaliśmy to, otwierając plik XML w przeglądarce Chrome i korzystając z narzędzi programisty do wykonywania zapytań XPath, co dało mi ponownie kategorię Film.

24

muszę wybrać każdą produkcję z kategorii, która nie zawiera „Business”

Chociaż upvoted @ odpowiedź Arran prawidłowe, chciałbym również dodać to ... interpretować ściśle, Szczegółowy op byłby realizowany za

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

niż

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

Ten ostatni wybiera każdą produkcję, której dziecko nie zawiera "Biznes". Dwa wyrażenia XPath będą zachowywać się inaczej, gdy production nie ma dzieci lub więcej niż jeden.

Nie ma to znaczenia w praktyce, o ile każde <production> ma dokładnie jedno dziecko <category>, jak w twoim krótkim przykładzie XML. To, czy zawsze możesz liczyć na to, że jest prawdziwe, czy nie, zależy od różnych czynników, na przykład od tego, czy masz schemat wymuszający to ograniczenie. Osobiście wybrałbym bardziej niezawodną opcję, ponieważ nie "kosztuje" wiele ... przy założeniu, że wymóg określony w pytaniu jest naprawdę poprawny (w przeciwieństwie do np. "Wybierz każdą produkcję, która nie ma kategorii która zawiera "Biznes" ").

+0

@LoamyHound: Dzięki do korekty! W końcu zobaczyłem twoją odpowiedź i naprawiłem brakujący wspornik ponad 2 lata później. – LarsH

1

można wykorzystywać not(expression) funkcji

not() jest funkcją w Xpath (w przeciwieństwie do operatora)

przykład:

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

lub

expression != true() 
Powiązane problemy