2011-12-12 3 views
4

이것은 내가 반대하는 일반적인 예입니다.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)

답변

1

내가 잘못 될 수있다을 만들었습니다,하지만 난이 가능하다고 생각하지 않습니다.

이벤트 컬렉션에서 본질적으로 구조는 다르지만 모두 동일한 이벤트 이름 "이벤트"를 원합니다. 이것은 스키마의 근본적인 제약에 반하는 것입니다 : http://www.w3.org/TR/xmlschema-1/#cos-element-consistent. xsi : type을 사용하면 스키마 프로세서가이 선택 사항을 명확히하여이 규칙을 위반하지 않도록하는 힌트를 제공합니다. 근본적으로 해결 방법입니다.

"event1"및 "event3"의 컬렉션 또는 선택적인 "events1"및 "event3"의 시퀀스가 ​​포함 된 외부 컬렉션을 갖기 위해 각각 다른 것을 호출 할 수 있습니까? 이런 방식으로 스키마를 적용하는 것이 훨씬 쉬울 것입니다. 또한 xsi : type을 전혀 사용할 필요가 없습니다. 이 제한을 피하기 위해 또는 다른 이유로 xsi : type을 인스턴스에 사용하면 확실하지 않지만 스키마를 사용하는 모든 사용자가 파생 된 형식에 대해 걱정할 필요가 없을 수 있습니다.

또는 다른 기술 (예 : schematron)을 사용하여이 제약 조건을 적용 할 수 있습니다.

+0

동의합니다. 귀하의 파생 사용은 복잡성을 더해 주지만 실제 이익은 보이지 않습니다. 각 이벤트 유형에 대한 순서를 각각 지정하십시오. – gilligan