2012-07-16 8 views

Odpowiedz

20

Można użyć wyrażenia regularnego - jeśli realizacja XPath obsługuje - lub napisać

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

co może być nieco krótszy.

+1

Miałeś rację, druga metoda, gdybym miała dwa elementy, takie jak "id1" i "id11", to zignorowałaby oba przez błąd – Aitorito

3

Może coś takiego ??

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

działa, ale ryzykowne dla zmian, ponieważ 'zawiera (x, y)' jest prawdziwe dla nieistniejącego y. – Arne

+1

@Arne Ten jest najkrótszy, ale w jakich przypadkach może zawieść? Atrybut, którego używamy do filtrowania, to unikalny identyfikator bez spacji. – Aitorito

5

Jeśli lista nazw atrybutów jest bardzo długa, po to dobry sposób, aby obsłużyć tę sytuację:

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

Musiałem zbudować bardzo długą XPath w .NET . Zamiast używać rzeczy takich jak LINQ Aggregate z seedem, możesz po prostu połączyć ciągi za pomocą "|", dodać końcowe i wiodące, i użyć go. Dzięki! – Nickmaovich

+0

@Nickmaovich, Nie ma za co. –

0

Przynajmniej w XPath 2 Ogólne porównania w sekwencji są wykonywane parami i egzystencjalnie, tak możesz napisać:

/item[not(@uid = ('id1','id2'))] 
Powiązane problemy