2013-06-21 6 views
1

기본 유형에서 요소를 파생시키고 싶습니다. 이 기본 유형 (Entity라고 함)에는 id 속성이 있습니다. 파생 요소의 경우이 속성에 제한을 추가하려고합니다 (파생 된 다른 Entity 요소에 대한 다른 제한 사항).확장 유형의 속성을 제한하는 방법

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:complexType name="Entity"> 
     <xs:attribute name="id"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:pattern value="[A-Z]+[0-9]+"/> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 
    <xs:element name="someEntity"> 
     <xs:complexType> 
      <xs:complexContent> 
       <xs:extension base="Entity"> 
        <xs:sequence> 
         <xs:element name="someAdditionalElement"/> 
        </xs:sequence> 
        <!-- I would like to restrict the attribute "id" for this entity to e.g. the pattern "SOME[0-9]+" --> 
       </xs:extension> 
      </xs:complexContent> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="otherEntity"> 
     <xs:complexType> 
      <xs:complexContent> 
       <xs:extension base="Entity"> 
        <xs:sequence> 
         <xs:element name="otherAdditionalElement"/> 
        </xs:sequence> 
        <!-- I would like to restrict the attribute "id" for this entity to a differtnt pattern like e.g. "OTHER[0-9]+" --> 
       </xs:extension> 
      </xs:complexContent> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

가능합니까? 그렇다면 어떻게 할 수 있습니까?

답변

4

유형을 확장 할 때 엔티티 유형에 확실히 요소를 추가 할 수 있습니다. 유형을 제한 할 때 id 속성을 확실히 제한 할 수 있습니다. 당신이 할 수없는 일은 (1) 동시에 타입을 확장하고 제한하는 것, (2) 십진수를 포함하는 문자열을 허용함으로써 대문자 알파벳 문자열 만 허용하는 id 속성을 '제한'하는 것 자릿수도. (사람들은 그가 당신이 원하는 일을 할 수 없다고 말했다 때 미모가 생각했던 것을 할 수있다.)

그래서 당신이 원하는 것을 할 수있는 방법은 다음과 같습니다

  1. 는 복합 유형 엔티티 정의, 파생 된 유형에서 허용하려는 모든 형식의 ID를 허용하는 id 속성이 있습니다.
  2. 각 파생 형식 (예 : someEntity 및 otherEntity)에 대해 먼저 Entity의 제한을 파생시킨 다음 해당 제한의 확장을 가져 오거나 그 반대의 경우에는 먼저 확장을 적용한 다음 제한을 적용합니다. 이러한 중간 유형을 다른 요소에 사용하지 않으려면 해당 요소를 추상화하십시오.

XSD 유효성 검사기는 속성 유형 (여기서는 id 속성)을 제한 할 때 새로운 유형이 이전 유형의 제한임을 쉽게 볼 수 있어야합니다. 따라서 Entity의 id 속성에 대해 로컬로 정의 된 유형을 사용하고 싶지는 않습니다. 정의 된 유형이 필요합니다. 그래서 당신은이 같은 두 개의 선언, 뭔가 엔티티에 대한 선언을 대체 할 수 있습니다 :

<xs:simpleType name="uppercase-alphanumeric-string"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="[A-Z0-9]+"/> 
    </xs:restriction> 
</xs:simpleType> 

<xs:complexType name="Entity"> 
    <xs:attribute name="id" type="uppercase-alphanumeric-string"/> 
</xs:complexType> 

그런 다음 두 단계로 요소 someEntity의 유형을 정의 할 수 있습니다. 먼저, 엔터티 유형에 대한 적절한 제한을 가진 복합 유형을 정의하십시오.

<xs:complexType name="Entity-restriction-SOME" abstract="true"> 
    <xs:complexContent> 
    <xs:restriction base="Entity"> 
     <xs:attribute name="id"> 
     <xs:simpleType> 
      <xs:restriction base="uppercase-alphanumeric-string"> 
      <xs:pattern value="SOME[0-9]+"></xs:pattern> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:attribute> 
    </xs:restriction> 
    </xs:complexContent> 
</xs:complexType> 

위에서 언급 한 것처럼 제한 또는 확장 또는 확장 후 제한을 수행 할 수 있습니다. 확장 된 유형의 콘텐츠 모델을 다시 지정하지 않아도되도록 제한을 먼저 수행하고 있습니다.

그런 다음 당신은 일반적인 방법으로 제한의 연장을 지정할 수 있습니다

<xs:element name="someEntity"> 
    <xs:complexType> 
    <xs:complexContent> 
     <xs:extension base="Entity-restriction-SOME"> 
     <xs:sequence> 
      <xs:element name="someAdditionalElement"/> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 
</xs:element> 

나는 독자들에게 운동으로 otherElement을 떠날거야.

+0

엔터티 유형에 대한 제한 패턴이 불완전 ([A-Z] +) - [A-Z] + [0-9] + 또는 [A-Z0-9]로되어 있습니다. 나는 이것을 바로 잡았다. 포괄적이고 유용한 답변을 주셔서 감사합니다. – yaccob

관련 문제