XSD: ¿Cuál es la diferencia entre xs: integer y xs: int?

111

Comencé a crear XSD y encontré un par de ejemplos para xs:integery xs:int.

¿Cuál es la diferencia entre xs:integery xs:int? ¿Cuándo debo usar xs:integer? ¿Cuándo debo usar xs:int?

Miguel
fuente

Respuestas:

110

La diferencia es la siguiente: xs:intes un entero de 32 bits con signo. xs:integeres un valor entero ilimitado. Para obtener más detalles , consulte https://web.archive.org/web/20151117073716/http://www.w3schools.com/schema/schema_dtypes_numeric.asp Por ejemplo, XJC (Java) genera Integerpara xs:inty BigIntegerpara xs:integer.

La conclusión: utilícelo xs:intsi desea trabajar en plataformas cruzadas y asegúrese de que sus números pasen sin problemas. Si desea números más grandes, use en xs:longlugar de xs:integer(se generará Long).

Miguel
fuente
2
Saxon 9 HE (Home Edition) solo admite 'xs: integer , but not xs: int` o xs:long.
Nishi
13
w3cshools no tiene autoridad. ¿Por qué no hacer referencia a las definiciones adecuadas? w3.org/2001/XMLSchema.xsd indica que el número entero está vinculado a +/- 9223372036854775808, por ejemplo. Además, la multiplataforma no tiene nada que ver con el xml (compatible).
Paul Hargreaves
@Nishi, suena como que Saxon 9 HE no cumple. Al leer la página saxon.sourceforge.net , parece que solo la versión EE es conforme.
Paul Hargreaves
2
@PaulHargreaves, Saxon 9 HE es (hasta donde yo sé) un procesador XSLT totalmente conforme: xs: int no está en el conjunto de tipos que se requiere que admita un procesador XSLT básico . Si quiere decir que no es un procesador XSD conforme, esto es cierto pero engañoso: no es un procesador XSD en absoluto.
CM Sperberg-McQueen
8
@PaulHargreaves, su comentario acerca de que +/- 9223372036854775808 es el máximo de "xs: integer" es incorrecto: XMLSchema.xsd define que "xs: long" es una restricción de "xs: integer" a +/- 9223372036854775808
metatechbe
30

El tipo xs: integer es una restricción de xs: decimal, con la faceta fracciónDigits establecida en cero y con un espacio léxico que prohíbe el punto decimal y los ceros finales que de otra manera serían legales. No tiene un valor mínimo o máximo, aunque las implementaciones que se ejecutan en máquinas de tamaño finito no son necesarias para poder aceptar valores arbitrariamente grandes o pequeños. (Deben admitir valores con 16 dígitos decimales).

El tipo xs: int es una restricción de xs: long, con la faceta maxInclusive establecida en 2147483647 y la faceta minInclusive en -2147483648. (Como puede ver, encajará convenientemente en un campo de entero con signo de 32 bits de dos complementos; xs: long se ajusta a un campo de entero con signo de 64 bits).

La regla habitual es: utilice la que coincida con lo que quiere decir. Si la restricción de un elemento o atributo es que su valor debe ser un número entero, xs: integer lo dice de forma concisa. Si la restricción es que el valor debe ser un número entero que pueda expresarse con un máximo de 32 bits en representación de complemento a dos, use xs: int. (Una preocupación secundaria, pero a veces importante, es si su cadena de herramientas funciona mejor con una que con la otra. Para los datos que durarán más que su cadena de herramientas, es aconsejable escuchar los datos primero; para los datos que existen únicamente para alimentar la herramienta cadena, y que no será de interés si cambia su cadena de herramientas, no hay razón para no escuchar la cadena de herramientas).

CM Sperberg-McQueen
fuente
Usted: las implementaciones que se ejecutan en máquinas de tamaño finito no están obligadas a [...] ¿Tiene el estándar un requisito de que las implementaciones que se ejecutan en máquinas infinitas (como las máquinas de Turing y demás) deben aceptar y representar correctamente el rango completo? :-) Eso sería genial, porque el universo, con las leyes de la física como se las conoce actualmente, no admite tales máquinas.
Jeppe Stig Nielsen
No, la especificación no tiene reglas especiales para implementaciones que se ejecutan en máquinas infinitas; todas las implementaciones pueden beneficiarse de las reglas que gobiernan la implementación parcial de los tipos de datos infinitos.
CM Sperberg-McQueen
6

Solo agregaría una nota de pedantería que puede ser importante para algunas personas: no es correcto decir que xs: int "es" un entero de 32 bits con signo. Esa forma de palabras implica una implementación en memoria (o registros, etc.) dentro de una computadora digital binaria. XML está basado en caracteres e implementaría el valor máximo de 32 bits con signo como "2147483647" (mis comillas, por supuesto), que es mucho más que 32 bits. Lo que SI es cierto es que xs: int es (indirectamente) una restricción de xs: integer que establece que los valores máximos y mínimos permitidos sean iguales a los límites impuestos por la implementación correspondientes de un entero de 32 bits con un bit de signo.

PeteCahill
fuente
No hay garantía de que el conjunto de información de origen validado con XSD venga en forma de una secuencia de caracteres; Si el esquema se usa para validar una instancia de documento construida por medio de XSLT o XQuery, existe la posibilidad de que un valor xs: int se pueda representar en la memoria usando la representación convencional para enteros de 32 bits.
CM Sperberg-McQueen
@ CMSperberg-McQueen, no estoy seguro de entender su punto. xs: int es un tipo con un rango, cómo se almacena es irrelevante para el XSD y cualquier cosa que codifique "int" como un entero de 32 bits con signo en la memoria está pidiendo problemas si, por ejemplo, se elige un XSD diferente que diga un int tiene un rango diferente al rango definido en el w3c XSD.
Paul Hargreaves
1
@PaulHargreaves es un punto un poco pedante (en el espíritu de la respuesta). La respuesta es correcta en que no es correcto decir rotundamente que xs: int es un entero de complemento a dos de 32 bits con signo. Pero la respuesta también dice que, dado que XML está basado en caracteres, el valor máximo de xs: int es la cadena de caracteres "2147483647"; eso último no es necesariamente así. Los tipos XSD se utilizan en muchos sistemas, por ejemplo, bases de datos XQuery, donde es más probable que un valor xs: int se represente en un campo de complemento a dos de 32 bits que como una cadena de caracteres Unicode.
CM Sperberg-McQueen
use "representa" en lugar de "es"
Chris Walsh