이것은 내가 반대하는 일반적인 예입니다.xsi 제약 조건 또는 제한 사항 :
내 스키마에서 파생 형식을 만들고 세 가지 파생 형식 중 두 개만 허용되는 제한이있는 제한되지 않은 목록 (시퀀스) 인 요소를 만들려고합니다.
최상위 레벨보기에서 말하자면 "한 상황에서 두 가지 유형의 이벤트 만있을 수있는 이벤트가 있습니다".
다음은 이벤트 및 그 이후의 시퀀스 소유자를 정의한 방법입니다. (이 모든 작품과 유효합니다).
추상 항목은 "이벤트 자료"라는 이름의 복합 형식이며, 이름이라는 공통 속성이 있습니다
<xs:complexType name="EventBase">
<xs:annotation><xs:documentation>***Abstract Event***</xs:documentation></xs:annotation>
<xs:attribute name="Name"/>
</xs:complexType>
으로
<xs:complexType name="DerivedEvent1">
<xs:complexContent>
<xs:extension base="EventBase">
<xs:attribute name="Alpha" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="DerivedEvent2">
<xs:complexContent>
<xs:extension base="EventBase">
<xs:attribute name="Beta"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="DerivedEvent3">
<xs:complexContent>
<xs:extension base="EventBase">
<xs:attribute name="Gamma"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
을 다음과 같이 그럼 추상에서 파생 된 세 가지 이벤트가 파생 된 이벤트를 보유하기 위해 복잡한 객체를 조작하고, 추상 컴플렉스에서 파생 된 구체적인 "일반"이벤트를 작성합니다.
<xs:element name="Event" type="EventBase">
<xs:annotation><xs:documentation>A generic event derived from abstract.</xs:documentation></xs:annotation>
</xs:element>
그런 다음 이벤트를 보관할 수 있기를 원하므로 위에 표시된 "일반"이벤트를 보관할 새 복합 개체를 만들고 최종 소비자가 파생 이벤트를 실제로 보관합니다.
이<xs:element name="Events"><xs:annotation><xs:documentation>Concrete holder of events.</xs:documentation></xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="Event" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
결과 XML은 다음과 같습니다 :
<?xml version="1.0" encoding="UTF-8"?>
<Events xsi:noNamespaceSchemaLocation="file:///C:/StackOverflow.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Event xsi:type="DerivedEvent1" Name="D1" Alpha="Content1"/>
<Event xsi:type="DerivedEvent3" Name="D1" Gamma="Content3"/>
</Events>
그래서 질문
<xs:complexType name="EventsCollectionType">
<xs:annotation><xs:documentation>Holds derived events</xs:documentation></xs:annotation>
<xs:sequence>
<xs:element ref="Event" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
마지막으로 나는 실제 이벤트를 개최 컬렉션 유형에서 파생 된 요소를 생성 마지막 이벤트를 어떻게 만들 수 있습니까? s * 특정 xsi : 입력 된 항목 만 보유하고 있습니까?
따라서 유도 된 유형 1과 3 만 유효하다고 제한되는 경우 (위와 같이); 유형 2가 파생 된 경우 유효하지 않습니다.
나는 공공 GIST (Constraint or Restriction on xsi:type)
동의합니다. 귀하의 파생 사용은 복잡성을 더해 주지만 실제 이익은 보이지 않습니다. 각 이벤트 유형에 대한 순서를 각각 지정하십시오. – gilligan