XSD: Apa perbedaan antara xs: integer dan xs: int?

111

Saya sudah mulai membuat XSD dan menemukan beberapa contoh untuk xs:integerdan xs:int.

Apa perbedaan antara xs:integerdan xs:int? Kapan saya harus menggunakan xs:integer? Kapan saya harus menggunakan xs:int?

Michael
sumber

Jawaban:

110

Perbedaannya adalah sebagai berikut: xs:intadalah integer 32-bit bertanda. xs:integeradalah nilai integer tak terbatas. Lihat untuk detailnya https://web.archive.org/web/20151117073716/http://www.w3schools.com/schema/schema_dtypes_numeric.asp Misalnya, XJC (Java) menghasilkan Integeruntuk xs:intdan BigIntegeruntuk xs:integer.

Intinya: gunakan xs:intjika Anda ingin bekerja lintas platform dan pastikan nomor Anda akan lulus tanpa masalah. Jika Anda menginginkan nomor yang lebih besar - gunakan xs:longsebagai pengganti xs:integer(ini akan dibuat menjadi Long).

Michael
sumber
2
Saxon 9 HE (Edisi Rumah) hanya mendukung 'xs: integer , but not xs: int` atau xs:long.
Nishi
13
w3cshools tidak berwibawa. Mengapa tidak merujuk definisi yang tepat? w3.org/2001/XMLSchema.xsd menyatakan bahwa integer terikat ke +/- 9223372036854775808, misalnya. Juga, lintas platform tidak ada hubungannya dengan xml (sesuai).
Paul Hargreaves
@Nishi, terdengar seperti Saxon 9 HE tidak konforman. Membaca halaman saxon.sourceforge.net sepertinya hanya versi EE yang sesuai.
Paul Hargreaves
2
@PaulHargreaves, Saxon 9 HE (sejauh yang saya tahu) adalah prosesor XSLT yang sepenuhnya sesuai: xs: int tidak ada dalam rangkaian jenis yang harus didukung oleh prosesor XSLT dasar . Jika yang Anda maksud itu bukan prosesor XSD yang sesuai, ini benar tetapi menyesatkan: ini sama sekali bukan prosesor XSD.
CM Sperberg-McQueen
8
@PaulHargreaves, komentar Anda tentang +/- 9223372036854775808 menjadi maksimum "xs: integer" salah: XMLSchema.xsd mendefinisikan bahwa "xs: long" adalah pembatasan "xs: integer" ke +/- 9223372036854775808
metatechbe
30

Tipe xs: integer adalah batasan dari xs: desimal, dengan faset fractionDigits disetel ke nol dan dengan spasi leksikal yang melarang titik desimal dan nol di belakang yang seharusnya legal. Ini tidak memiliki nilai minimum atau maksimum, meskipun implementasi yang berjalan di mesin berukuran terbatas tidak diharuskan untuk dapat menerima nilai besar atau kecil secara sewenang-wenang. (Mereka diperlukan untuk mendukung nilai dengan 16 digit desimal.)

Tipe xs: int adalah batasan dari xs: long, dengan faset maxInclusive disetel ke 2147483647 dan faset minInclusive ke -2147483648. (Seperti yang Anda lihat, ini akan cocok dengan nyaman ke dalam bidang bilangan bulat bertanda 32-bit dua komplemen; xs: panjang pas dalam bidang bilangan bulat bertanda 64-bit.)

Aturan yang biasa adalah: gunakan salah satu yang cocok dengan apa yang ingin Anda katakan. Jika batasan pada elemen atau atribut adalah bahwa nilainya harus berupa bilangan bulat, xs: integer akan mengatakannya secara ringkas. Jika batasannya adalah bahwa nilai harus berupa bilangan bulat yang dapat diekspresikan dengan maksimal 32 bit dalam representasi dua komplemen, gunakan xs: int. (Masalah sekunder namun terkadang penting adalah apakah rantai alat Anda berfungsi lebih baik dengan yang satu dibandingkan dengan yang lain. Untuk data yang akan hidup lebih lama dari rantai alat Anda, sebaiknya dengarkan datanya terlebih dahulu; untuk data yang ada hanya untuk memberi makan alat tersebut rantai, dan yang tidak akan menarik jika Anda mengubah rantai alat Anda, tidak ada alasan untuk tidak mendengarkan rantai alat.)

CM Sperberg-McQueen
sumber
Anda: implementasi yang berjalan pada mesin dengan ukuran terbatas tidak diharuskan untuk [...] Apakah standar memiliki persyaratan bahwa implementasi yang berjalan pada mesin tak terbatas (seperti mesin Turing dan sejenisnya) harus menerima dan merepresentasikan jangkauan penuh dengan benar? :-) Itu keren, karena alam semesta, dengan hukum fisika seperti yang sekarang dikenal, tidak menerima mesin seperti itu.
Jeppe Stig Nielsen
Tidak, spesifikasi tidak memiliki aturan khusus untuk implementasi yang dijalankan pada mesin tak terbatas; semua implementasi diizinkan untuk mendapatkan keuntungan dari aturan yang mengatur implementasi parsial dari tipe data tak hingga.
CM Sperberg-McQueen
6

Saya hanya akan menambahkan catatan tentang pedantry yang mungkin penting bagi sebagian orang: tidak benar untuk mengatakan bahwa xs: int "adalah" integer 32-bit yang ditandatangani. Bentuk kata-kata itu menyiratkan implementasi dalam memori (atau register, dll) dalam komputer digital biner. XML berbasis karakter dan akan menerapkan nilai maksimum 32-bit yang ditandatangani sebagai "2147483647" (kutipan saya, tentu saja), yang lebih dari 32 bit! Apa yang benar adalah bahwa xs: int adalah (secara tidak langsung) batasan dari xs: integer yang menetapkan nilai maksimum dan minimum yang diizinkan menjadi sama dengan batas yang diberlakukan implementasi terkait dari integer 32-bit dengan bit tanda.

PeteCahill
sumber
Tidak ada jaminan bahwa sumber infoset yang divalidasi dengan XSD datang dalam bentuk urutan karakter; jika skema digunakan untuk memvalidasi contoh dokumen yang dibangun dengan menggunakan XSLT atau XQuery, ada kemungkinan bahwa nilai xs: int dapat direpresentasikan dalam memori menggunakan representasi konvensional untuk bilangan bulat 32-bit.
CM Sperberg-McQueen
@ CMSperberg-McQueen, saya tidak yakin saya mengerti maksud Anda. xs: int adalah tipe dengan rentang, cara penyimpanannya tidak relevan dengan XSD dan semua kode keras "int" sebagai bilangan bulat bertanda 32 bit dalam memori menanyakan masalah jika, misalnya, XSD berbeda dipilih yang mengatakan sebuah int memiliki jangkauan yang berbeda dengan jangkauan seperti yang didefinisikan dalam w3c XSD.
Paul Hargreaves
1
@PaulHargreaves itu adalah poin yang sedikit terlalu sombong (dalam semangat jawabannya). Jawabannya benar bahwa tidak benar untuk mengatakan dengan terus terang bahwa xs: int adalah bilangan bulat 32-bit bertanda dua komplemen. Tetapi jawabannya juga mengatakan bahwa karena XML berbasis karakter, nilai maksimum xs: int adalah string karakter "2147483647"; bagian terakhir itu belum tentu begitu. Tipe XSD digunakan oleh banyak sistem, misalnya database XQuery, di mana nilai xs: int lebih mungkin ditampilkan dalam bidang pelengkap dua 32-bit daripada sebagai string karakter Unicode.
CM Sperberg-McQueen
gunakan "mewakili" di tempat "adalah"
Chris Walsh