XSD: Sự khác biệt giữa xs: integer và xs: int là gì?


111

Tôi đã bắt đầu tạo XSD và tìm thấy trong một vài ví dụ cho xs:integerxs:int.

Sự khác biệt giữa xs:integervà là xs:intgì? Khi nào tôi nên sử dụng xs:integer? Khi nào tôi nên sử dụng xs:int?

Câu trả lời:


110

Sự khác biệt là như sau: xs:intlà một số nguyên 32 bit có dấu. xs:integerlà một giá trị không bị ràng buộc số nguyên. Xem chi tiết https://web.archive.org/web/20151117073716/http://www.w3schools.com/schema/schema_dtypes_numeric.asp Ví dụ: XJC (Java) tạo Integercho xs:intBigIntegerchoxs:integer .

Điểm mấu chốt: sử dụng xs:intnếu bạn muốn làm việc trên nhiều nền tảng và chắc chắn rằng các con số của bạn sẽ vượt qua mà không có vấn đề gì. Nếu bạn muốn số lớn hơn - hãy sử dụng xs:longthay vì xs:integer(nó sẽ được tạo thành Long).


2
Saxon 9 HE (Home Edition) chỉ hỗ trợ 'xs: integer , but not xs: int` hoặc xs:long.
Nishi

13
w3cshools không có thẩm quyền. Tại sao không tham khảo các định nghĩa thích hợp? w3.org/2001/XMLSchema.xsd tuyên bố rằng số nguyên được liên kết với +/- 9223372036854775808, chẳng hạn. Ngoài ra, nền tảng chéo không liên quan gì đến xml (tuân thủ).
Paul Hargreaves

@Nishi, nghe có vẻ như Saxon 9 HE không phù hợp. Đọc trang saxon.sourceforge.net có vẻ như chỉ có phiên bản EE là phù hợp.
Paul Hargreaves

2
@PaulHargreaves, Saxon 9 HE (theo như tôi biết) là một bộ xử lý XSLT hoàn toàn phù hợp: xs: int không nằm trong tập hợp các loại mà bộ xử lý XSLT cơ bản bắt buộc phải hỗ trợ . Nếu ý bạn là nó không phải là một bộ xử lý XSD phù hợp, thì điều này đúng nhưng gây hiểu lầm: nó hoàn toàn không phải là một bộ xử lý XSD.
CM Sperberg-McQueen

8
@PaulHargreaves, nhận xét của bạn về việc +/- 9223372036854775808 là giá trị tối đa của "xs: integer" là sai: XMLSchema.xsd xác định rằng "xs: long" là giới hạn của "xs: integer" thành +/- 9223372036854775808
metatechbe

30

Các xs: integer là một giới hạn của xs: decimal, với khía cạnh fractionDigits được đặt thành 0 và có khoảng trắng từ vựng cấm dấu thập phân và các số 0 ở cuối mà nếu không sẽ hợp pháp. Nó không có giá trị tối thiểu hoặc tối đa, mặc dù việc triển khai chạy trong các máy có kích thước hữu hạn không bắt buộc phải chấp nhận các giá trị lớn hoặc nhỏ tùy ý. (Chúng được yêu cầu hỗ trợ các giá trị có 16 chữ số thập phân.)

Kiểu xs: int là một hạn chế của xs: long, với khía cạnh maxInclusive được đặt thành 2147483647 và khía cạnh minInclusive thành -2147483648. (Như bạn có thể thấy, nó sẽ phù hợp thuận tiện với trường số nguyên có dấu 32 bit hai bổ sung; xs: long phù hợp với trường số nguyên có dấu 64 bit.)

Quy tắc thông thường là: sử dụng từ phù hợp với những gì bạn muốn nói. Nếu ràng buộc đối với một phần tử hoặc thuộc tính là giá trị của nó phải là số nguyên, thì xs: integer nói lên điều đó một cách chính xác. Nếu ràng buộc là giá trị phải là một số nguyên có thể được biểu diễn với tối đa 32 bit trong biểu diễn bổ sung hai phần, hãy sử dụng xs: int. (Mối quan tâm thứ yếu nhưng đôi khi quan trọng là liệu chuỗi công cụ của bạn có hoạt động tốt hơn với chuỗi công cụ này hay không. Đối với dữ liệu sẽ tồn tại lâu hơn chuỗi công cụ của bạn, điều khôn ngoan là nên lắng nghe dữ liệu trước; đối với dữ liệu chỉ tồn tại để cung cấp cho công cụ chuỗi, và sẽ không quan tâm nếu bạn thay đổi chuỗi công cụ của mình, không có lý do gì để không lắng nghe chuỗi công cụ.)


Bạn: các triển khai chạy trong các máy có kích thước hữu hạn không bắt buộc phải [...] Tiêu chuẩn có yêu cầu rằng các triển khai chạy trên các máy có kích thước vô hạn (như máy Turing và công cụ) phải chấp nhận và thể hiện đúng phạm vi không? :-) Điều đó thật tuyệt, bởi vì vũ trụ, với các định luật vật lý như chúng đang được biết đến, không thừa nhận những cỗ máy như vậy.
Jeppe Stig Nielsen,

Không, đặc điểm kỹ thuật không có quy tắc đặc biệt cho việc triển khai chạy trên máy vô hạn; tất cả các triển khai đều được phép hưởng lợi từ các quy tắc điều chỉnh việc triển khai từng phần của các kiểu dữ liệu vô hạn.
CM Sperberg-McQueen,

6

Tôi chỉ thêm một lưu ý quan trọng đối với một số người: không đúng khi nói rằng xs: int "là" một số nguyên 32 bit có dấu. Dạng từ đó ngụ ý việc triển khai trong bộ nhớ (hoặc thanh ghi, v.v.) trong máy tính kỹ thuật số nhị phân. XML dựa trên ký tự và sẽ triển khai giá trị có dấu 32 bit tối đa là "2147483647" (tất nhiên là dấu ngoặc kép của tôi), nhiều hơn 32 bit rất nhiều! Điều IS đúng là xs: int là (gián tiếp) là một giới hạn của xs: integer đặt giá trị tối đa và tối thiểu được phép giống với giới hạn được áp dụng tương ứng của một số nguyên 32 bit với một bit dấu.


Không có gì đảm bảo rằng bộ thông tin nguồn được xác thực với XSD ở dạng một chuỗi ký tự; nếu lược đồ được sử dụng để xác thực một cá thể tài liệu được xây dựng bằng XSLT hoặc XQuery, thì có mọi khả năng giá trị xs: int có thể được biểu diễn trong bộ nhớ bằng cách sử dụng biểu diễn thông thường cho số nguyên 32 bit.
CM Sperberg-McQueen

@ CMSperberg-McQueen, tôi không chắc mình hiểu quan điểm của bạn. xs: int là một kiểu có một dải ô, cách nó được lưu trữ không liên quan đến XSD và bất kỳ thứ gì mã cứng "int" dưới dạng số nguyên có dấu 32 bit trong bộ nhớ đang đặt ra các vấn đề nếu, ví dụ, một XSD khác được chọn. một int có một phạm vi khác với phạm vi được xác định trong w3c XSD.
Paul Hargreaves

1
@PaulHargreaves đó là một điểm hơi lãng xẹt (theo tinh thần của câu trả lời). Câu trả lời đúng là không đúng khi nói thẳng ra rằng xs: int một số nguyên bổ sung 32-bit có dấu. Nhưng câu trả lời cũng nói rằng vì XML dựa trên ký tự, giá trị lớn nhất của xs: int là chuỗi ký tự "2147483647"; bit cuối cùng không nhất thiết phải như vậy. Các kiểu XSD được nhiều hệ thống sử dụng, ví dụ như cơ sở dữ liệu XQuery, trong đó giá trị xs: int có nhiều khả năng được biểu diễn trong trường bổ sung 32-bit hơn là một chuỗi ký tự Unicode.
CM Sperberg-McQueen

sử dụng "đại diện" thay cho "là"
Chris Walsh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.