tôi có một lựa chọn complexType tên abType
:Làm thế nào để mở rộng một complexType lựa chọn mà không cần giải trình tự lựa chọn?
<xs:complexType name="abType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="a"/>
<xs:element name="b"/>
</xs:choice>
</xs:complexType>
loại này có thể được sử dụng để tạo ra các yếu tố với a
và b
nút trong bất kỳ thứ tự như thế này ví dụ:
<ab>
<b/>
<a/>
</ab>
Bây giờ tôi muốn tạo một loại có nguồn gốc được gọi là abcType
để cho phép các nút a
, b
và c
theo bất kỳ thứ tự nào. Vì vậy, tôi đã tạo ra một complexType mới dựa trên abType
:
<xs:complexType name="abcType">
<xs:complexContent>
<xs:extension base="abType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="c"/>
</xs:choice>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Sau đó tôi tạo ra một nút abc
:
<abc>
<c/>
<b/>
<a/>
</abc>
Nhưng nút này là không hợp lệ ! Không được đặt bất kỳ số a
hoặc b
nào sau c
. Lý do là, mà phát sinh một loại từ một loại cơ sở tạo ra một chuỗi implicite mặc dù cả hai loại là sự lựa chọn. XMLSpy minh họa nó theo cách này:
Kết quả này là khá vô dụng với nhiều loại lựa chọn.
Vì vậy, câu hỏi của tôi là: Làm cách nào để mở rộng loại lựa chọn mà không cần giải trình tự lựa chọn?
Đây là XSD đầy đủ và kiểm tra tệp tin XML để tạo lại vấn đề:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element ref="ab"/>
<xs:element ref="abc"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ab" type="abType"/>
<xs:complexType name="abType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="a"/>
<xs:element name="b"/>
</xs:choice>
</xs:complexType>
<xs:element name="abc" type="abcType"/>
<xs:complexType name="abcType">
<xs:complexContent>
<xs:extension base="abType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="c"/>
</xs:choice>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Ví dụ:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="inherit-choice.xsd">
<ab>
<b/>
<a/>
</ab>
<abc>
<c/>
<b/>
<a/>
</abc>
</root>
Làm thế nào để thực hiện quyền thừa kế với các nhóm thay thế? – ceving
Bạn có thể giải thích tại sao bạn đang sử dụng chặn thay thế không? – prasopes
@prasopes, không có lý do cụ thể trong trường hợp này. Nó nói chung, nó sẽ phụ thuộc vào những gì bạn đang cố gắng làm. Nếu bạn quan tâm để xem nếu nó áp dụng cho trường hợp của bạn, có một cái nhìn vào những gì nó có nghĩa là (ví dụ như [ở đây] (https://msdn.microsoft.com/en-us/library/ms256118 (v = vs. 110) .aspx)). –