Я думаю, что спецификация в этой области очень неудачна, но она ясна: значение является xs:positiveInteger
только в том случае, если оно помечено как таковое, а не просто потому, что оно (а) целое и (б) положительное. Это долго обсуждалось в рабочей группе XQuery с участием некоторых выдающихся экспертов по системам типов языков программирования (таких как Фил Уодлер), и это решение было принято. Мне самой это не понравилось.
Где спецификация это говорит? Определения в спецификации XDM — хорошее начало:
https://www.w3.org/TR/xpath-datamodel-31/#xs-types
[Определение: атомарное значение — это значение в пространстве значений атомарного типа, помеченное именем этого атомарного типа.]
[Определение: Атомарный тип — это примитивный простой тип или тип, производный от другого атомарного типа путем ограничения.] (Типы, производные от списка или объединения, не являются атомарными.)
[Определение: Примитивные простые типы — это типы, определенные в 2.1.1 Типы, заимствованные из XML-схемы.]
Затем в §3.1.1 спецификации XQuery говорится о числовых литералах:
Значение числового литерала, не содержащего "." и ни один символ e или E не является атомарным значением типа xs:integer.
§3.18.1 дает правила для оператора «экземпляр»:
Логический оператор instance of
возвращает значение true, если значение его первого операнда соответствует SequenceType во втором операнде в соответствии с правилами сопоставления SequenceType;
и §2.5.5.2 дает соответствующее правило для сопоставления SequenceType:
ItemType, состоящий просто из EQName, интерпретируется как AtomicOrUnionType. Ожидаемый тип AtomicOrUnionType соответствует атомарному значению, фактический тип которого — AT, если значение производного от( AT, AtomicOrUnionType ) равно true.
В совокупности получается, что выражение 3 instance of xs:positiveInteger
возвращает false (поскольку xs:integer
не является производным от xs:positiveinteger
).
Наконец, когда ожидаемый тип аргумента функции равен xs:positiveInteger
, а вызов функции предоставляет значение 3, тогда вступают в действие правила преобразования функций из §3.1.5.2. Они допускают различные преобразования предоставленного значения в требуемый тип, но «понижающее приведение» от xs:integer к xs:positiveInteger не является одним из них. Итак, ошибка:
Если после приведенных выше преобразований результирующее значение не соответствует ожидаемому типу в соответствии с правилами сопоставления SequenceType, возникает ошибка типа [err:XPTY0004].
Как я уже сказал, мне не нравятся правила, и я много раз пытался их изменить. Но они ясны, и любой продукт, который им не соответствует, является несоответствующим.
person
Michael Kay
schedule
27.03.2020
declare local:any function (...
должно бытьdeclare function local:any(...
. - person Joe Wicentowski   schedule 27.03.2020