XSD: В чем разница между xs: integer и xs: int?

111

Я начал создавать XSD и нашел пару примеров для xs:integerи xs:int.

В чем разница между xs:integerи xs:int? Когда мне следует использовать xs:integer? Когда мне следует использовать xs:int?

Майкл
источник

Ответы:

110

Разница в следующем: xs:intэто 32-битное целое число со знаком. xs:integer- целое неограниченное значение. Подробнее см. Https://web.archive.org/web/20151117073716/http://www.w3schools.com/schema/schema_dtypes_numeric.asp Например, XJC (Java) генерирует Integerдля xs:intи BigIntegerдля xs:integer.

Итог: используйте, xs:intесли хотите работать на кросс-платформенных платформах, и будьте уверены, что ваши числа пройдут без проблем. Если вам нужны числа побольше - используйте xs:longвместо xs:integer(будет сгенерировано в Long).

Майкл
источник
2
Saxon 9 HE (Home Edition) поддерживает только 'xs: integer , but not xs: int` или xs:long.
Nishi
13
w3cshools не является авторитетным. Почему бы не сослаться на правильные определения? Например, в w3.org/2001/XMLSchema.xsd целое число связано с +/- 9223372036854775808. Кроме того, кроссплатформенность не имеет ничего общего с (совместимым) xml.
Пол Харгривз
@Nishi, похоже, что Saxon 9 HE не соответствует требованиям. Читая страницу saxon.sourceforge.net, кажется, что совместима только версия EE.
Пол Харгривз
2
@PaulHargreaves, Saxon 9 ОН (насколько я знаю) , полностью совместимый процессор XSLT: хз: INT не в наборе типов основной XSLT процессор требуется для поддержки . Если вы имеете в виду, что это не соответствующий XSD-процессор, это правда, но вводит в заблуждение: это вообще не XSD-процессор.
CM Sperberg-McQueen,
8
@PaulHargreaves, ваш комментарий о том, что +/- 9223372036854775808 является максимальным значением «xs: integer», неверен: XMLSchema.xsd определяет, что «xs: long» является ограничением «xs: integer» до +/- 9223372036854775808
metatechbe
30

Тип xs: integer - это ограничение xs: decimal, с параметром fractionDigits, установленным на ноль, и с лексическим пространством, которое запрещает десятичную точку и конечные нули, которые в противном случае были бы допустимы. Он не имеет минимального или максимального значения, хотя реализации, работающие на машинах конечного размера, не обязаны принимать произвольно большие или малые значения. (Они должны поддерживать значения с 16 десятичными цифрами.)

Тип xs: int является ограничением xs: long, при этом для фасета maxInclusive установлено значение 2147483647, а для фасета minInclusive - -2147483648. (Как видите, он удобно помещается в поле 32-битного целого со знаком с двумя дополнениями; xs: long подходит для поля 64-битного целого числа со знаком.)

Обычное правило: используйте тот, который соответствует тому, что вы хотите сказать. Если ограничение на элемент или атрибут состоит в том, что его значение должно быть целым числом, xs: integer говорит об этом кратко. Если ограничение заключается в том, что значение должно быть целым числом, которое может быть выражено максимум 32 битами в представлении с дополнением до двух, используйте xs: int. (Второстепенная, но иногда важная проблема заключается в том, работает ли ваша цепочка инструментов лучше с одним, чем с другим. Для данных, которые будут жить дольше, чем ваша цепочка инструментов, разумно сначала прослушать данные; для данных, которые существуют исключительно для подачи инструмента цепи, и которая не будет представлять интереса, если вы измените цепочку инструментов, нет причин не слушать цепочку инструментов.)

К.М. Сперберг-Маккуин
источник
Вы: реализации, работающие на машинах конечного размера, не требуются для [...] Есть ли в стандарте требование, чтобы реализации, работающие на бесконечных машинах (например, машинах Тьюринга и т. Д.), Принимали и должным образом представляли полный диапазон? :-) Это было бы круто, потому что Вселенная с нынешними законами физики не допускает таких машин.
Jeppe Stig Nielsen
Нет, в спецификации нет специальных правил для реализаций, работающих на бесконечных машинах; всем реализациям разрешено пользоваться правилами, регулирующими частичную реализацию бесконечных типов данных.
CM Sperberg-McQueen,
6

Я бы просто добавил педантичность, которая может быть важна для некоторых людей: неправильно говорить, что xs: int «является» 32-битным целым числом со знаком. Эта форма слов подразумевает реализацию в памяти (или регистрах и т. Д.) В двоичном цифровом компьютере. XML основан на символах и будет реализовывать максимальное 32-битное значение со знаком как «2147483647» (мои цитаты, конечно), что намного больше 32 бит! Верно то, что xs: int (косвенно) является ограничением xs: integer, которое устанавливает максимальное и минимальное допустимые значения такими же, как соответствующие ограничения, накладываемые реализацией 32-разрядного целого числа со знаковым битом.

ПитКахилл
источник
Нет гарантии, что исходный информационный набор, проверенный с помощью XSD, представлен в виде последовательности символов; если схема используется для проверки экземпляра документа, созданного с помощью XSLT или XQuery, есть все возможности, что значение xs: int может быть представлено в памяти с использованием обычного представления для 32-битных целых чисел.
CM Sperberg-McQueen
@ CMSperberg-McQueen, я не уверен, что понимаю вашу точку зрения. xs: int - это тип с диапазоном, способ его хранения не имеет отношения к XSD, и все, что жестко кодирует int как 32-битное целое число со знаком в памяти, вызывает проблемы, если, например, выбран другой XSD, который говорит int имеет диапазон, отличный от диапазона, определенного в w3c XSD.
Пол Харгривз
1
@PaulHargreaves, это немного педантичный момент (в духе ответа). Ответ правильный: нельзя прямо сказать, что xs: int - это 32-битное целое число с дополнением до двух со знаком. Но в ответе также говорится, что, поскольку XML является символьным, максимальное значение xs: int - это символьная строка «2147483647»; это последнее не обязательно так. Типы XSD используются множеством систем, например базами данных XQuery, где значение xs: int с большей вероятностью будет представлено в 32-битном поле с дополнением до двух, чем в виде строки символов Unicode.
CM Sperberg-McQueen
используйте «представляет» вместо «есть»
Крис Уолш