Я думаю, что spe c в этой области очень прискорбно, но ясно: значение равно xs:positiveInteger
, только если оно помечено как таковое, а не просто потому, что оно является (a) целым числом и (b) ) положительный В Рабочей группе XQuery велись долгие дискуссии с участием некоторых видных экспертов по системам типов языков программирования (таких как Фил Уодлер), и это решение было принято. Мне самому это не понравилось.
Где spe c говорит это? Определения в XDM spe c являются хорошим началом:
https://www.w3.org/TR/xpath-datamodel-31/#xs -типов
[Определение: значение atomi c равно значение в пространстве значений типа atomi c и помечено именем этого типа atomi c.]
[Определение: тип atomi c является примитивным простым типом или тип, полученный ограничением другого типа атома c.] (Типы, полученные списком или объединением, не являются атомами c.)
[Определение: простые примитивные типы - это типы, определенные в 2.1.1 Типы взято из XML Схема.]
Затем §3.1.1 в XQuery spe c говорит о числовых значениях c:
Значение цифра c литерал, не содержащий "." и ни один символ e или E не является атомом c значением типа xs: integer.
§3.18.1 дает правила для оператора "instance of":
Логический оператор instance of
возвращает true, если значение его первого операнда соответствует SequenceType во втором операнде, в соответствии с правилами сопоставления SequenceType;
и §2.5.5.2 дают соответствующие правило соответствия SequenceType:
ItemType, состоящий просто из EQName, интерпретируется как AtomicOrUnionType. Ожидаемый тип AtomicOrUnionType соответствует значению атома c, фактический тип которого равен 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 Matching, возникает ошибка типа [err: XPTY0004].
Как я уже сказал, мне не нравятся правила, и я неоднократно пытался их изменить. Но они понятны, и любой продукт, который им не следует, не соответствует.