|
การสร้าง Simple Data Type
Simple Data Type สามารถสร้างใหม่ได้โดยการใช้ simple Type Element การประกาศ
DTD เป็นสิ่งจำเป็นสำหรับ simpleType Element ที่แสดงด้านล่างนี้ (สำหรับการประกาศที่สมบูรณ์สามารถดูได้ที่ข้อกำหนดลักษณะเฉพาะของ
Schema ที่ http://www.w3.org/IR/xmlschema-2/)
|
<!ENTITY % ordeed ' (minInclusive | minExclusive)
| (maxInclusive | maxExclusive) | precision | scale '>
<!ENTITY % unordered 'pattern | enumeration | length | maxlength
| minlength | encoding | period '>
<!ENTITY % facet '%ordered; | %unordered;'>
<!ELEMENT simpleType ((annotation)?, (%facet;)*)>
<!ATTLIST simpleType
name NMTOKEN #IMPLIED
base CDATA #REQUIRED
final CDATA ''
abstract (true | false) 'false'
derivedBy (list | restriction | reproduction) 'retriction'>
<!ELEMENT annotation (documentation)>
<!ENTITY % facetAttr 'value CDATA #REQUIRED'>
<!ENTITY % facetMdel '(annotation)?'>
<!ELEMENT maxExclusive %facetModel;>
<!ATTLIST maxExclusive %facetAttr;>
<!ELEMENT mminExclusive %facetModel;>
<!ATTLIST minExclusive %facetAttr;>
<!ELEMENT maxInclusid %facetModel;>
<!ATTLIST maxInclusive %facetAttr;>
<!ELEMENT minInclusive %facetModel;>
<!ATTLIST minInclusive %facetAttr;>
<!ELEMENT precision %facetModel;>
<!ATTLIST precision %facetAttr;>
<!ELEMENT scale %facetModel;>
<!ATTLIST scale %facetAttr;>
<!ELEMENT length %facetModel;>
<!ATTLIST length %facetAttr;>
<!ELEMENT minlength %faceModel;>
<!ATTLIST minlength %facetAttr;>
<!ELEMENT maxlength %facetModel;>
<!ATTLIST maxlength %facetAttr;>
<!-This one can be repeated. -->
<!ELEMENT enumeration %facetmodel;>
<!ATTLIST enumeration %facetAttr;>
<!ELEMENT pattern %facetModel;>
<!ATTLIST patern %facetAttr;>
<!ELEMENT encoding %facetModel;>
<!ATTLIST encoding %facetAttr;>
<!ELEMENT period %facetModel>
<!ATTLIST period %facetAttr;>
<!ELEMENT documentation ANY>
<!ATTLIST documentation source CDATA #IMPLIED>
<!ELEMENT documentation ANY>
<!ATTLIST documentation
source CDATA #IMPLIED
xml:lang CDATA #IMPLIED>
|
ดังที่เห็นแล้วว่า simpleType Element ซึ่งเป็นตัวแทนของ Simple Data Type
สามารถเป็น Ordered หรือ Unordered Data Type แบบ Ordered สามารถอยู่ในการเรียงลำดับตามต้องการในกรณีของการเรียงบำดับค่า
Integer บวก คุณสามารถเริ่มต้นที่ค่าที่ 0 และต่อไปจนถึงค่าจำนวนเต็มสุงสุด
Unordered Data Type ไม่มีการจัดลำดับใดๆ แต่มีการรวม Data Type เข้าไว้ด้วยเฃ่น
Boolean ซึ่งไม่สามารถวางในแบการเรียงลำดับใดๆ แต่มีการรวม Data Type เข้าไว้ด้วย
เช่น Boolean ซึ่งไม่สามารถวางในแบบการเรียงบำดับได้ การใช้ DTD ที่กล่าวถึงก่อนหน้านี้ทำให้คุณสามารถกำหนด
Simple Data Type ของตัวเอง โดยที่ Simple Data Type เหล่านี้สามารถนำมาใช้ใน
Schema ของคุณเพื่อกำหนดได้ด้วยการใช้ Unordered Element
สำหรับ Data Type ประกอบด้วย Boolean และ binary Data Type ซึ่ง Numeric
Data Type ทั้งหมดเป็น Ordered สตริงเป็น Ordered แต่เมี่อกำหนด String Data
Type เองก็สามารถ กำหนดได้ด้วยการใช้ Unordered Element
สำหรับ Data Type แต่ละตัวเราสามารถใช้ Child Element เพื่อกำหนด simpleType
Element ซึ่ง Child Element แต่ละตัวบรรจะแอตทริบิวต์ร่วมกับค่าของ Child
Element และคอมเมนต์ที่เป็นทางเลือก Child Element กำหนด Facet สำหรับ Data
Type ที่สร้างขึ้น
ในตอนนี้ให้ดูที่วิธีการสร้าง Simple Data Type โดยการใช้ Ordered และ Unordered
Facet
การใช้ Ordered Facet
สังเกตดูจากโค้ดที่ผ่านมา Ordered Facet ประกอบด้วย Facet ดังต่อไปนี้คือ
maxExclusive, minExclusive, MaxInclude, minInclude, precision และ scale
ค่าของ maxExclusive คือค่าที่น้อยที่สุดของ Data Type ซึ่งอยู่ภายนอกค่าสูงสุด
(Upper Bound) ในพื้นที่ค่า (Space) ของ Data Type ค่า minExclusive คือค่าที่มากที่สุดของ
Data Type ซึ่งอยู่ภายนอกค่าที่ต่ำที่สุด (Lower Bound) ของช่อง่างระหว่างค่า
(Space) สำหรับ Data Type ดังนั้นถ้าคุณต้องการมี Inter Data Type ในช่วงระหว่าง
100 ถึง 1000 ค่าของ minExcluseive จะมีค่าเท่ากับ 99 และค่าของ maxExcusive
คือ 1001 การประกาศ Simple Data Type ทำได้ดังต่อไปนี้
|
<simpleType name="limitedInteger"
base="interger">
<minExcluseive="99"/>
<maxExclusive="1001"/>
</simpleType>
|
minInclusie และ maxInclusive Facet ทำงานเหมือนกัน minExclusive
และ maxExclusive นอกจากค่าของ minInclusive คือค่าต่ำสุดของระยะห่างระหว่างค่าของ
Data Type และ maxInclusive คือค่าสูงสุดของระยะห่างระหว่างค่าของ Data Type
โดย Simple Data Type สามารถเขียนใหม่ได้ดังนี้
|
<simpleType name="limitedInteger"
base="integer">
<minInclusive="1010"/>
<maxInclusive="100"/>
</simpleType>
|
Precision คือจำนวนของตัวเลขที่ถูกใช้เพื่อแสดงจำนวนส่วน
Scale แทนจำนวนของเลขหลักต่างๆ ที่ปรากฏด้านขวามือของตำแหน่งจุดทศนิยมซึ่งจะต้องน้อยกว่า
Precision เสมอ เช่น Data Type ที่ไม่ได้มีขนาดใหญ่มากนัก แต่ประกอบด้วยค่า
1,000,000 และมีเลขทศนิยมสองหลัก (1,000,000.00) จะมี Precision เท่ากับ
9 (ยกเว้นเครื่องหมายจุลภาพและจุดทศนิยม) และ Scale เท่ากับ 2 การประกาศสามารถทำได้ดังนี้
|
<simpleType name="TotalSales" base="integer">
<minInclusive="0"/>
<maxInclusive="1000000"/>
<precision="9"/>
<scale="2"/>
</simpleType>
|
ถ้าไม่ได้ประกาศ maxInclusive Facet จำนวนค่าตัวเลขสูงสุดที่สามารถมีได้คือ
9,999,999 เป็นค่าที่ถูกต้อง ถ้ามีค่าน้อยกว่า 1,000,000 การประกาศต่อไปนี้ก็พอเพียง
|
<simpleType name="TotalSales" base="integer">
<precision="8"/>
<scale="2"/>
</simpleType>
|
ในตอนนี้ได้ศึกษาวิธีการใช้ Ordered Facet เพื่อสร้าง Simple Data Type
ให้ดูวิธีการใช้ Unordered Facet เพื่อสร้าง Simple Data Type
การใช้ Unordered Facet
ในโค้ดที่ผ่านมาจะเห็นได้ว่า Unordered Facet สร้างจาก Facet ต่อไปนี้ คือ
period, length, maxLength, minLength, pattern, enumeration และ encoding
สำหรับ Time Data Type สามารถใช้ period Facet เพื่อกำหนดอัตราการเกิดขึ้นอีกของ
Data Type โดยที่ period Facet ใช้ใน TimeDuration Data Type เช่น ถ้าต้องการสร้า
Special Holiday Data Type ซึ่งเป็นวันหยุดของประเทศสหรัฐอเมริกา สามารถใช้การประกาศต่อไปนี้
|
<simpleType name="holidays" base="date">
<annotation>
<documentation>Some U.S. holidays</documentation>
</annotation>
<enumeration value="-01-01">
<annotation>
<documentation>New Year's Day</documentation>
</annotation>
</enumeration>
<enumeration value="-07-04">
<annotation>
<documentation>Fourth of July</documentation>
</annotation>
</enumeration>
<enumeration value="-12-25">
<annotation>
<documentation>Chistmas</documentation>
</annotation>
</enumeration>
</simpleType>
|
เมื่อใช้ length Facet แล้ว Data Type ต้องมีความยาวที่คงที่แน่นอน ในการใช้
length สามารถสร้างสตริงที่มีความยาวแน่นอน maxLength Facet แสดงความยาวสุงสุดที่
Data Type สามารถมีได้ minLength Facet แสดงความยาวน้อยที่สุดที่ Data Type
สามารถมีได้ การใช้ minLength และ maxLength สามารถกำหนดสตริงให้มีความยาวที่เปลี่ยนแปลงได้ซึ่งเป็นค่าความยาวที่น้อยที่สุดโดยใช้
minLength และค่าความยาวมากที่สุดโดยใช้ maxLength
Pattern Facet เป็นข้อจำกัดหนึ่งของพื้นที่ค่า (Space Value) ของ Data Type
ซึ่งมาจากการจำกัดพื้นที่ของคำ (ค่าที่ถูกต้อง) Enumeration Facet จำกัดพื้นที่ค่าไปยังชุดของค่า
(Value) Encoding Facet ถูกนำมาใช้สำหรับค่าประเภทไบนารีซึ่งสามารถเข้ารหัสเป็นเลขฐานสิบหก
หรือ Base64 นอกจากจะมี Facet แล้ว Simple Date Type ยังประกอบด้วยแอตทริบิวต์ที่สามารถใช้เพื่อกำหนด
Data Type ในตอนนี้ให้ไปดูที่แอตทริบิวต์เหล่านี้
แอตทริบิวต์สำหรับ Simple Data Type
ให้สังเกตโค้ดข้างล่างนี้ simpleType Element ประกอบด้วยแอตทริบิวต์ต่อไปนี้คือ
name, base, abstract, final และ derivedBy ซึ่ง name Attribute สามารถเป็นแอตทริบิวต์ได้ทั้งชนิด
Built-In หรือ User-Defined ส่วน base Attribute เป็นแอตทริบิวต์ประเภทพื้นฐานที่ใช้เพื่อระบุแอตทริบิวต์ชนิดใหม่
derivedBy Attrivute สามารถกำหนดให้แก่ list, restriction หรือ reproduction
ค่า list จะยอมให้สร้าง Data Type ที่ประกอบด้วยรายการของ Item ที่แยกโดยการเว้นวรรค
เฃ่น สามารถ
ใช้การประกาศต่อไปนี้เพื่อสร้าง Data Type List
<simpleType name='StringList' base='string' derivedBy='list'>
Data Type นี้สามาถใช้ในเอกสาร XML เพื่อสร้างแอตทริบิวต์ประเภท List ใหม่เช่นที่แสดงนี้
|
<myListElement xsi:type='StringList'>
This is not list item 1.
This is not list item 2.
This is not list item 3.
</myListElement>
|
ด้วยการใช้ xsi สามารถลบคำสั่งการประกาศที่เป็นค่าดีฟอลต์ของ myListElement
และสร้าง StringList Data Type เนื่องจาก StringList Data Type ประกอบด้วยรายการสตริงซึ่งสามารถใช้เป็นเนื้อหาสำหรับ
myListElement
สรุป
Schema ทำให้เราสามาถเชื่อมความสัมพันธ์ระหว่าง Data Type กับแอตทริบิวตต์เพื่อสร้าง
Data Type ของเราเอง และกำหนดโครงสร้างเอกสารของเราโดยใช้ Well-Formed XML
จะพบว่า Schema ถูกใช้เพื่อกำหนดเอเลเมนต์ที่มีความสัมพันธ์กับชื่อและประเภท
(Type) ประเภทสามารถเป็ฯได้ทั้ง Data Type หรือแอตทริบิวต์หรือเอเลเมนต์ตั้งแต่
1 ตัวหรือมากกว่า เอเลเมนต์สามารถจัดกลุ่มรวมอยู่ใน group Element และแอตทริบิวต์สามารถจัดกลุ่มรวมเข้าไว้ด้วยกันใน
attributeGroup Element ดังนี้ group และ attributeGroup Element สามารถนำมาใช้ในขอบเขตระดับ
Local (Local Scope) หรือขอบเขตระดับเอกสาร (Document Scope)
Schema ได้จัดสร้างประโยชน์ต่างๆ มากมายที่มีความสามารถเหนือกว่า DTD เช่น
Schema สามารถใช้ Namespace อีกทั้งยังใช้ประโยชน์ในขอบเขตที่กว้างขวางของ
Data Type และถูกเขียนในรูปบบ XML ซึ่งดูเหมือนว่า Schema จะค่อยๆ เข้ามาแทนที่
DTD ในไม่กี่ปีนี้
|