คำตอบใหม่สำหรับคำถามเก่า
ไม่มีคำตอบใดที่มีอยู่สำหรับคำถามเก่านี้ที่ช่วยแก้ปัญหาที่แท้จริง
ปัญหาที่แท้จริงคือxs:complexType
ไม่สามารถมีxs:extension
บุตรใน XSD ได้โดยตรง การแก้ไขคือต้องใช้xs:simpleContent
ก่อน รายละเอียดตาม ...
XML ของคุณ
<price currency="euros">20000.00</price>
จะถูกต้องกับอย่างใดอย่างหนึ่งของ XSDs การแก้ไขดังต่อไปนี้:
ประเภทแอตทริบิวต์ที่กำหนดภายในเครื่อง
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="price">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="currency">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="pounds" />
<xs:enumeration value="euros" />
<xs:enumeration value="dollars" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
ประเภทแอตทริบิวต์ที่กำหนดโดยส่วนกลาง
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="currencyType">
<xs:restriction base="xs:string">
<xs:enumeration value="pounds" />
<xs:enumeration value="euros" />
<xs:enumeration value="dollars" />
</xs:restriction>
</xs:simpleType>
<xs:element name="price">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="currency" type="currencyType"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
หมายเหตุ
- ตามความเห็นของ @Paulสิ่งเหล่านี้จะเปลี่ยนประเภทเนื้อหา
price
จากxs:string
เป็นxs:decimal
แต่สิ่งนี้ไม่จำเป็นอย่างยิ่งและไม่ใช่ปัญหาที่แท้จริง
- ตามคำตอบของ @ user998692คุณสามารถแยกความหมายของสกุลเงินออกและคุณสามารถเปลี่ยนเป็น
xs:decimal
ได้ แต่นี่ก็ไม่ใช่ปัญหาที่แท้จริงเช่นกัน
ปัญหาที่แท้จริงคือxs:complexType
ไม่สามารถมีxs:extension
บุตรใน XSD ได้โดยตรง xs:simpleContent
เป็นสิ่งจำเป็นก่อน
เรื่องที่เกี่ยวข้อง (ไม่ได้ถาม แต่อาจมีคำตอบอื่นที่สับสน):
จะprice
ถูก จำกัด ได้อย่างไรเนื่องจากมีแอตทริบิวต์?
ในกรณีนี้priceType
จำเป็นต้องมีคำจำกัดความสากลที่แยกจากกัน เป็นไปไม่ได้ที่จะทำสิ่งนี้ด้วยคำจำกัดความประเภทโลคัลเท่านั้น
วิธี จำกัด เนื้อหาองค์ประกอบเมื่อองค์ประกอบมีแอตทริบิวต์
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="priceType">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0.00"/>
<xs:maxInclusive value="99999.99"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="price">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="priceType">
<xs:attribute name="currency">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="pounds" />
<xs:enumeration value="euros" />
<xs:enumeration value="dollars" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>