Câu trả lời mới cho câu hỏi cũ
Không có câu trả lời nào cho câu hỏi cũ này giải quyết được vấn đề thực sự.
Vấn đề thực sự làxs:complexType
không thể trực tiếp cóxs:extension
một đứa trẻ khi còn nhỏ trong XSD. Cách khắc phục là sử dụngxs:simpleContent
trước. Thông tin chi tiết theo ...
XML của bạn,
<price currency="euros">20000.00</price>
sẽ có hiệu lực đối với một trong các XSD đã sửa sau đây:
Loại thuộc tính được xác định cục bộ
<?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>
Loại thuộc tính được xác định trên toàn cầu
<?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>
Ghi chú
- Như nhận xét của @Paul , chúng thay đổi kiểu nội dung
price
từ xs:string
thành xs:decimal
, nhưng điều này không hoàn toàn cần thiết và không phải là vấn đề thực sự.
- Như được trả lời bởi @ user998692 , bạn có thể tách định nghĩa về tiền tệ và bạn có thể thay đổi thành
xs:decimal
, nhưng đây cũng không phải là vấn đề thực sự.
Vấn đề thực sự là xs:complexType
không thể có xs:extension
một đứa trẻ khi còn nhỏ trong XSD; xs:simpleContent
là cần thiết đầu tiên.
Một vấn đề liên quan (không được hỏi nhưng có thể làm nhầm lẫn các câu trả lời khác):
Làm thế nào có thể price
bị hạn chế vì nó có một thuộc tính?
Trong trường hợp này, priceType
sẽ cần một định nghĩa toàn cầu, riêng biệt về ; không thể làm điều này chỉ với các định nghĩa kiểu cục bộ.
Cách hạn chế nội dung phần tử khi phần tử có thuộc tính
<?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>