2012-07-16 7 views

risposta

20

È possibile utilizzare espressioni regolari - se l'implementazione XPath supporta - o scrivere

/item[not(@uid='id1' or @uid='id2')] 

che potrebbe essere un po 'più breve.

+1

Avevi ragione, l'altro metodo se avessi due elementi come "id1" e "id11" ignorerebbe entrambi per errore – Aitorito

3

Forse qualcosa di simile ??

/item[not(contains('id1 id2', @uid))] 
+1

funziona, ma rischioso per le modifiche, poiché 'contains (x, y)' è vero per y inesistente. – Arne

+1

@Arne Questo è il più breve ma in quali casi fallirebbe? L'attributo che utilizziamo per filtrare è un ID univoco senza spazi – Aitorito

5

Se l'elenco dei nomi degli attributi è molto lunga, il seguente è un buon modo per gestire questa situazione:

//item[not(contains('|attr1|attr2|attr3|attr4|attr5|attr6|attrN|', 
        concat('|', @uid, '|') 
        ) 
      )] 
+0

Avevo bisogno di creare XPath molto lungo in .NET. . Invece di usare cose come il metodo LINQ Aggregate con seed, puoi semplicemente unire le stringhe con '|', aggiungere trailing e leading e usarlo. Grazie! – Nickmaovich

+0

@Nickmaovich, prego. –

0

coppie Almeno in XPath vengono eseguite 2 confronti generali sulle sequenze ed esistenzialmente, così puoi scrivere:

/item[not(@uid = ('id1','id2'))]