XPath - Разница между «не» и «! =» - PullRequest
6 голосов
/ 16 февраля 2010

Просто быстрый вопрос о разнице между xpath 'not' и '! =' В следующем содержании.

Принимая XML:

<years>
  <year value="2010"></year>
  <year value="2010"></year>
  <year value="2010"></year>
  <year value="2009"></year>
</years>

Я хочу выбрать уникальные годы. Некоторое время я боролся за это, но в конце концов справился, но странным образом этого не ожидал.

Следующий xpath является правильным для моего намерения и возвращает два уникальных года узлов 2009 и 2010.

years/year[not(@value = preceding-sibling::year/@value)]

Следующее возвращает только узел 2009 года.

years/year[@value != preceding-sibling::year/@value]

Единственная разница между ними - операторы! =, А не операторы. Некоторое время я размышлял над этим и не могу найти разницу, которую мог бы удовлетворительно объяснить кому-либо еще.

Возможно, кто-то может помочь.

Приветствия

Steve

Ответы [ 3 ]

8 голосов
/ 16 февраля 2010

Второй пример не работает, потому что, если вы примените его к каждому из первых 3 узлов, он никогда не совпадет. Для первого <year> нет предшествующего родного брата, значение которого можно попытаться сравнить, поэтому он не соответствует. Для второго и третьего их предыдущий узел имеет одно и то же значение, поэтому проверка на неравенство завершается неудачно и снова не приводит к совпадению.

Версия not(...) работает, потому что в первом узле происходит сбой целого @value = preceding-sibling::year/@value из-за отсутствия предшествующего родного брата, и этот сбой инвертируется на not, что дает совпадение на первом узле.

8 голосов
/ 16 февраля 2010

В XPath a != b и not(a = b) ОЧЕНЬ отличаются

Вот почему

Из спецификации для XPath 1.0:

Если оба объекта для сравнения наборы узлов, тогда сравнение будет истина, если и только если есть узел в первый набор узлов и узел в второй набор узлов, так что результат выполнения сравнения на Строковые значения двух узлов правда.

это означает, что (a = b) для наборов узлов - true, если есть совпадение между любым элементом в a и b.
(a! = b) означает, что некоторый элемент в НЕ соответствует некоторому элементу в b. поэтому для узловых множеств A = (1, 2), B = (1, 2). ОБА a = b и a! = B вернет true.

В вашем случае происходит то, что (2010 != empty set) всегда ложно, а
not (2010 = empty set) всегда верно. Подумайте о правилах сопоставления, как указано выше.

0 голосов
/ 16 февраля 2010

я не профессионал в xpath, но я думаю, что not не возвращает обратное значение вмещающей вещи, а! = Возвращает значение сравнения между двумя сравниваемыми вещами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...