XPath - Различие между 'не' и'! ='

Просто быстрый вопрос относительно различия между xpath's 'не' и'! =' в следующем содержании.

Взятие 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

6
задан Steven Wilber 16 February 2010 в 15:15
поделиться

3 ответа

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

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

8
ответ дан 8 December 2019 в 14:42
поделиться

"Сильно типизированный" в данном случае означает, что Visual Studio пытается создать объектную модель для использования на основе имен ресурсов.

Например, у вас есть файл ресурсов с URL-адресами, указывающими на ваши любимые веб-сайты. ваши ресурсы являются чем-то вроде:

, когда генерируемый ресурс используется для строгого ввода этой информации, вы получите объектную модель, которую можно назвать так:

строка строка msUrl = Resources.Microsoft;

Если в имени ресурса имеется точка, генератор кода не может использовать ее, поскольку создаст недопустимые имена в объекте Resources. для примера:

это будет недопустимым, так как при попытке создать ресурс с именем Resources.Asp.NET

-121--3246015-

с строгой типизацией переменная, поле или свойство имеют определенный тип, а не только Объект .

public class User
{
    public String FirstName { get; set; } // Strongly typed
    public Object LastName { get; set; } // Weakly typed
}

При использовании ресурсов со строгой типизацией создается код со свойствами со строгой типизацией для всех ресурсов. В этом случае имя ресурса используется в качестве имени свойства, поэтому оно должно быть допустимым именем свойства C #. Пример МБ _ ArchiveRestore.cs _ 11 содержит точку и, следовательно, не является допустимым именем свойства. Генератор кода заменит точку на знак подчеркивания, чтобы сделать имя действительным, и выдаст описанное предупреждение, чтобы сообщить вам об этом.

-121--3246012-

В XPath a! = b и not (a = b) СИЛЬНО ОТЛИЧАЮТСЯ

Вот почему

из спецификации для XPath 1,0:

Если сравниваются оба объекта: node-sets, тогда сравнение будет true тогда и только тогда, когда имеется узел в первый набор узлов и узел в второй узел установлен так, что результат выполнения сравнения на строковые значения двух узлов правда.

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

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

8
ответ дан 8 December 2019 в 14:42
поделиться

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

0
ответ дан 8 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: