2012-06-13 7 views
42

Ho alcuni XML che è strutturato in questo modo:Come usare not contains() in xpath?

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

e ho bisogno di selezionare ogni produzione con una categoria che non contiene "Business" (così solo la prima produzione in questo esempio).

Ciò è possibile con xpath? Ho provato a lavorare in questa direzione, ma ottenuto da nessuna parte:

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

risposta

79

query XPath sono case sensitive. Dopo aver guardato il vostro esempio (che, tra l'altro, è impressionante, nessuno sembra fornire più esempi!), Posso ottenere il risultato desiderato semplicemente cambiando "business", "Business"

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

I ho provato questo aprendo il file XML in Chrome e utilizzando gli strumenti di sviluppo per eseguire le query XPath e mi ha restituito solo la categoria Film.

24

Ho bisogno di selezionare ogni produzione con una categoria che non contiene "Business"

Anche se ho upvoted @ risposta di Arran come corretta, vorrei anche aggiungere questo ... interpretata in senso stretto, specifica del pO potrebbe essere implementata come

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

anziché

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

Quest'ultimo seleziona ogni produzione il cui figlio primocategory non contiene "Business". Le due espressioni XPath si comportano in modo diverso quando uno production non ha figli category o più di uno.

Non fa alcuna differenza nella pratica finchè ogni <production> ha esattamente un figlio <category>, come nel tuo breve esempio XML. Se si può sempre contare sul fatto che ciò sia vero o meno, dipende da vari fattori, ad esempio se si dispone di uno schema che impone tale vincolo. Personalmente, opterei per l'opzione più robusta, dal momento che non "costa" molto ... assumendo che il tuo requisito come indicato nella domanda sia veramente corretto (al contrario di eg 'seleziona ogni produzione che non ha una categoria che contiene "Affari").

+0

@LoamyHound: Grazie per la correzione! Alla fine ho visto la tua risposta e ho riparato la staffa mancante, oltre 2 anni dopo. – LarsH

1

È possibile utilizzare not(expression) funzione

not() è una funzione in xpath (al contrario di un operatore)

Esempio:

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

O

expression != true()