XPath 1.0 сравнение NaN и любого другого значения

#xpath #nan #xpath-1.0

#xpath #nan #xpath-1.0

Вопрос:

Я изучаю XML и XPath в своем университетском курсе (XPath 1.0, если быть точным), и я наткнулся на что-то. Например. если я напишу выражение:

 NaN < true()
  

возвращает значение true . Что очень странно. Когда я это делаю.

NaN < 1

возвращает значение false. AFAIK сравнения XPath 1.0 (без наборов узлов) сначала преобразуют значения в числа и только затем сравнивают их. Итак, в первом выражении это выглядит так

NaN < number(true()) -> NaN < 1

и во втором

NaN < 1

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

Заранее спасибо!

Ответ №1:

Токен NaN не представляет двойное значение NaN, это сокращение для child::NaN которого возвращает пустой набор узлов (если, конечно, ваш XML-документ не содержит элемент с именем NaN).

Я немного удивлен, что университет должен преподавать XPath 1.0, который уже давно заменен новыми версиями. Конечно, многие люди все еще используют его, но я бы подумал, что университет будет преподавать более новую версию.

Комментарии:

1. Понял. Как тогда будет записано двойное значение NaN? А также, просто потому, что, может быть, вы знаете, как будет записано числовое значение infinity в 1.0? О второй части: расскажите мне об этом. Рассуждения профессора заключались в том, что 1.0 по-прежнему является наиболее распространенной версией. В дальнейшем мы также будем изучать jQuery, который довольно старый (но широко используемый для устаревших систем).

2. Хорошо, но зачем NaN < 1 оценивать значение false для второго примера OP?

3. NaN < 1 и NaN > 1 и NaN < true() и NaN > true() все оцениваются с false использованием командной строки BaseX 9.4. Компиляция для последнего выражения: Компиляция: - remove step without results: *:NaN - rewrite cached step to empty sequence: *:NaN -> () - rewrite cached path to empty sequence: db:open-pre("my", 0)/() -> () - rewrite fn:true() to xs:boolean item: true() - rewrite empty sequence to xs:boolean item: () -> false() - rewrite fn:boolean(items) to xs:boolean item: boolean(()) -> false() - rewrite > comparison to xs:boolean item: () > true() -> false()

4. Правило XPath 1.0 для сравнения набора узлов с логическим значением заключается в том, что пустой набор узлов обрабатывается как false, непустой набор узлов как true; а false меньше true. При сравнении набора узлов с числом набор узлов преобразуется в число, и преобразование дает NaN, если набор узлов пуст: таким образом, в контексте числового сравнения NaN обозначает child::NaN , что обычно является пустым набором узлов, который при преобразовании в число выдаетзначение NaN.

5. @Kibertas существует много способов записи константы NaN, но, вероятно, самый ясный number("NaN") . Если я правильно помню (прошло много времени с тех пор, как я использовал XPath 1.0), положительная бесконечность записывается как 1 div 0 , хотя это не идеально, потому что она несовместима с 2.0; если вам нужна конструкция, совместимая с прямой, попробуйте number(1) div number(0) .