XSD: xs: integer และ xs: int ต่างกันอย่างไร


111

ฉันได้เริ่มต้นในการสร้าง XSD และพบว่าในสองสามตัวอย่างสำหรับและxs:integerxs: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และสำหรับBigIntegerxs: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 (ตามมาตรฐาน)
Paul Hargreaves

@ นิชิฟังดูเหมือนแซกซอน 9 เขาไม่สอดคล้องกัน เมื่ออ่านหน้าsaxon.sourceforge.netดูเหมือนว่ามีเพียงเวอร์ชัน EE เท่านั้นที่เป็นไปตามข้อกำหนด
Paul Hargreaves

2
@PaulHargreaves แซกซอน 9 เขาเป็น (เท่าที่ผมรู้) หน่วยประมวลผล XSLT สอดคล้องอย่างเต็มที่: XS: int ไม่ได้อยู่ในชุดของประเภทหน่วยประมวลผล XSLT พื้นฐานที่จำเป็นในการสนับสนุน หากคุณหมายความว่าไม่ใช่โปรเซสเซอร์ XSD ที่เป็นไปตามนั้นนี่เป็นเรื่องจริง แต่ทำให้เข้าใจผิด: ไม่ใช่โปรเซสเซอร์ XSD เลย
CM Sperberg-McQueen

8
@PaulHargreaves ความคิดเห็นของคุณเกี่ยวกับ +/- 9223372036854775808 ค่าสูงสุดของ "xs: integer" ผิด: XMLSchema.xsd กำหนดว่า "xs: long" เป็นข้อ จำกัด ของ "xs: integer" ถึง +/- 9223372036854775808
metatechbe

30

ประเภทxs: จำนวนเต็มเป็นข้อ จำกัด ของ xs: decimal โดยที่ส่วนหน้าเศษส่วนจะตั้งค่าเป็นศูนย์และมีช่องว่างคำศัพท์ซึ่งห้ามไม่ให้จุดทศนิยมและศูนย์ต่อท้ายซึ่งจะถูกกฎหมาย ไม่มีค่าต่ำสุดหรือสูงสุดแม้ว่าการนำไปใช้งานที่ทำงานในเครื่องที่มีขนาด จำกัด ไม่จำเป็นต้องสามารถยอมรับค่าขนาดใหญ่หรือน้อยได้ตามอำเภอใจ (จำเป็นต้องรองรับค่าที่มีทศนิยม 16 หลัก)

ประเภทxs: intเป็นข้อ จำกัด ของ xs: long โดยตั้งค่า maxInclusive facet เป็น 2147483647 และ minInclusive facet เป็น -2147483648 (อย่างที่คุณเห็นมันจะพอดีกับฟิลด์จำนวนเต็มลายเซ็น 32 บิตสองส่วนที่เติมเต็มได้อย่างสะดวก xs: ยาวพอดีกับฟิลด์จำนวนเต็มที่ลงชื่อ 64 บิต)

กฎปกติคือใช้ข้อที่ตรงกับสิ่งที่คุณต้องการพูด หากข้อ จำกัด ขององค์ประกอบหรือแอตทริบิวต์คือค่าของมันต้องเป็นจำนวนเต็ม xs: integer จะบอกว่าอย่างรวบรัด หากข้อ จำกัด คือค่าต้องเป็นจำนวนเต็มที่สามารถแสดงได้สูงสุด 32 บิตในการแทนค่าสองส่วนให้ใช้ xs: int (ข้อกังวลรอง แต่บางครั้งก็สำคัญคือห่วงโซ่เครื่องมือของคุณทำงานได้ดีกว่าโซ่เครื่องมืออื่นหรือไม่สำหรับข้อมูลที่จะอยู่ได้นานกว่าห่วงโซ่เครื่องมือของคุณคุณควรฟังข้อมูลก่อนสำหรับข้อมูลที่มีอยู่เพื่อป้อนเครื่องมือเท่านั้น โซ่และจะไม่สนใจหากคุณเปลี่ยนโซ่เครื่องมือก็ไม่มีเหตุผลที่จะไม่ฟังห่วงโซ่เครื่องมือ)


คุณ: การใช้งานที่ทำงานในเครื่องจักรที่มีขนาด จำกัด ไม่จำเป็นต้อง [... ]มาตรฐานมีข้อกำหนดหรือไม่ว่าการใช้งานบนเครื่องจักรที่ไม่มีที่สิ้นสุด (เช่นเครื่องจักรทัวริงและสิ่งของต่างๆ) ควรยอมรับและเป็นตัวแทนของช่วงเต็มหรือไม่? :-) นั่นจะเจ๋งเพราะจักรวาลด้วยกฎของฟิสิกส์ที่เป็นที่รู้จักในปัจจุบันไม่ยอมรับเครื่องจักรดังกล่าว
Jeppe Stig Nielsen

ไม่ข้อกำหนดไม่มีกฎพิเศษสำหรับการใช้งานบนเครื่องที่ไม่มีที่สิ้นสุด การใช้งานทั้งหมดได้รับอนุญาตให้ใช้ประโยชน์จากกฎที่ควบคุมการนำไปใช้งานบางส่วนของประเภทข้อมูลที่ไม่มีที่สิ้นสุด
CM Sperberg-McQueen

6

ฉันแค่จะเพิ่มหมายเหตุเกี่ยวกับความอวดรู้ที่อาจมีความสำคัญสำหรับบางคน: การบอกว่า xs: int "เป็น" จำนวนเต็ม 32 บิตที่ลงชื่อนั้นไม่ถูกต้อง คำในรูปแบบนั้นแสดงถึงการนำไปใช้ในหน่วยความจำ (หรือรีจิสเตอร์ ฯลฯ ) ภายในคอมพิวเตอร์ดิจิทัลแบบไบนารี XML เป็นแบบอักขระและจะใช้ค่าสูงสุด 32 บิตที่ลงชื่อเป็น "2147483647" (คำพูดของฉันแน่นอน) ซึ่งมากกว่า 32 บิต! สิ่งที่เป็นจริงคือ xs: int คือ (ทางอ้อม) ข้อ จำกัด ของ xs: จำนวนเต็มซึ่งกำหนดค่าสูงสุดและต่ำสุดที่อนุญาตให้เหมือนกับขีด จำกัด ที่กำหนดในการนำไปใช้งานที่สอดคล้องกันของจำนวนเต็ม 32 บิตพร้อมบิตเครื่องหมาย


ไม่มีการรับประกันว่าชุดข้อมูลต้นทางที่ตรวจสอบด้วย XSD จะอยู่ในรูปแบบของอักขระตามลำดับ หากสคีมาถูกใช้เพื่อตรวจสอบความถูกต้องของอินสแตนซ์เอกสารที่สร้างโดย XSLT หรือ XQuery มีความเป็นไปได้ทุกประการที่ค่า xs: int สามารถแสดงในหน่วยความจำโดยใช้การแทนค่าแบบเดิมสำหรับจำนวนเต็ม 32 บิต
CM Sperberg-McQueen

@ CMSperberg-McQueen ฉันไม่แน่ใจว่าฉันเข้าใจประเด็นของคุณ xs: int เป็นประเภทที่มีช่วงวิธีการจัดเก็บไม่เกี่ยวข้องกับ XSD และสิ่งใดก็ตามที่ฮาร์ดโค้ด "int" เป็นจำนวนเต็ม 32 บิตที่ลงชื่อในหน่วยความจำจะถามปัญหาเช่นถ้าเลือก XSD อื่นที่ระบุว่า int มีช่วงที่แตกต่างจากช่วงที่กำหนดไว้ใน w3c XSD
Paul Hargreaves

1
@PaulHargreaves มันเป็นจุดอวดดีเล็กน้อย (ในจิตวิญญาณของคำตอบ) คำตอบคือถูกต้องไม่ถูกต้องที่จะพูดตรงๆว่า xs: int เป็นจำนวนเต็ม32 บิต twos-complement ที่ลงชื่อ แต่คำตอบยังบอกด้วยว่าเนื่องจาก XML เป็นแบบอักขระค่าสูงสุดของ xs: int คือสตริงอักขระ "2147483647"; บิตสุดท้ายนั้นไม่จำเป็นต้องเป็นเช่นนั้น ประเภท XSD ถูกใช้โดยระบบจำนวนมากเช่นฐานข้อมูล XQuery โดยที่ค่า xs: int มีแนวโน้มที่จะแสดงในช่อง 32-bit twos-complement มากกว่าเป็นสตริงของอักขระ Unicode
CM Sperberg-McQueen

ใช้ "แทน" แทน "is"
Chris Walsh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.