2009-03-09 4 views
59

로하는 SimpleType 또는 제한에 속성을 추가 다음과 같이 문제는 :XML을의 복합 타입 스키마

나는 다음과 같은 XML 조각이 있습니다

<time format="minutes">11:60</time> 

문제는 내가 모두를 추가 할 수 있다는 것입니다을 속성과 제한을 동시에 적용 할 수 있습니다. 속성 형식은 분, 시간 및 초 값만 가질 수 있습니다. 시간은 내가 timeType의 복합 형식을하면, 내가 속성 있지만 제한을 추가 할 수 있습니다 \d{2}:\d{2}

<xs:element name="time" type="timeType"/> 
... 
<xs:simpleType name="formatType"> 
<xs:restriction base="xs:string"> 
    <xs:enumeration value="minutes"/> 
    <xs:enumeration value="hours"/> 
    <xs:enumeration value="seconds"/> 
</xs:restriction> 
</xs:simpleType> 
<xs:complexType name="timeType"> 
    <xs:attribute name="format"> 
     <xs:simpleType> 
      <xs:restriction base="formatType"/> 
     </xs:simpleType> 
    </xs:attribute> 
</xs:complexType> 

restrictionpattern을 가지고, 나는 간단한 유형을 만들 경우, 나는 제한이 아닌 속성을 추가 할 수 있습니다 . 이 문제를 해결할 수있는 방법이 있습니까? 이것은 매우 이상한 제한이 아니거나 그렇지 않습니까?

답변

110

확장으로 파생해야하는 특성을 추가하려면 제한으로 파생해야하는 패싯을 추가하십시오. 따라서이 작업은 요소의 하위 내용에 대해 두 단계로 수행해야합니다. 실제로 속성을 추가하는 동안 제한 상속 유형을 혼합에 필요한 무엇인지에 대한 자세한 설명과 함께 내 예를 제안하고 싶습니다

<xsd:simpleType name="timeValueType"> 
    <xsd:restriction base="xsd:token"> 
    <xsd:pattern value="\d{2}:\d{2}"/> 
    </xsd:restriction> 
</xsd:simpleType> 

<xsd:complexType name="timeType"> 
    <xsd:simpleContent> 
    <xsd:extension base="timeValueType"> 
     <xsd:attribute name="format"> 
     <xsd:simpleType> 
      <xsd:restriction base="xsd:token"> 
      <xsd:enumeration value="seconds"/> 
      <xsd:enumeration value="minutes"/> 
      <xsd:enumeration value="hours"/> 
      </xsd:restriction> 
     </xsd:simpleType> 
     </xsd:attribute> 
    </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 
+0

soooo 많은 감사합니다! – t1gor

1

: 속성은 인라인으로 정의 할 수 있습니다.

이것은 상속 된 유형을 정의하는 장소입니다 (제 경우에는 xs : string을 기반으로 한 필드 길이 1024 제한 적용). 필드에 "속성"을 추가 할 때 필드의 표준 유형으로 사용할 수 없습니다.

<xs:element maxOccurs="unbounded" name="event"> 
    <xs:complexType> 
    <xs:simpleContent> 
     <xs:extension base="string1024Type"> 
     <xs:attribute default="list" name="node" type="xs:string"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

두 블록이 완전히 분리 된 장소에있을 수 있습니다 :

<xs:simpleType name="string1024Type"> 
    <xs:restriction base="xs:string"> 
     <xs:maxLength value="1024"/> 
    </xs:restriction> 
    </xs:simpleType> 

이 당신의 요소가 개인 유형에 따라 정의 된 장소가 추가 필요한 속성 (내 경우는 "string1024Type"입니다) 귀하의 스키마. 중요한 포인트는 다시 한번만 따라옵니다. 동일한 요소 정의에서 상속과 특성 지정을 혼합 할 수 없습니다.