#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)
.