IT TIP

단순 유형에 속성 추가 또는 XML 스키마의 복합 유형에 제한

itqueen 2020. 11. 20. 17:32
반응형

단순 유형에 속성 추가 또는 XML 스키마의 복합 유형에 제한


문제는 다음과 같습니다.

다음 XML 스 니펫이 있습니다.

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

문제는 속성과 제한을 동시에 추가 할 수 없다는 것입니다. 속성 형식은 분, 시간 및 초 값만 가질 수 있습니다. 시간에는 제한 패턴이 있습니다\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>

복잡한 유형의 timeType을 만들면 속성을 추가 할 수 있지만 제한은 추가 할 수 없으며 단순 유형을 만들면 제한을 추가 할 수 있지만 속성은 추가 할 수 없습니다. 이 문제를 해결할 방법이 있습니까? 이것은 매우 이상한 제한이 아닙니다.


속성을 추가하려면 확장으로 파생해야하고 패싯을 추가하려면 제한으로 파생해야합니다. 따라서 이것은 요소의 자식 콘텐츠에 대해 두 단계로 수행되어야합니다. 속성은 인라인으로 정의 할 수 있습니다.

<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>

속성을 추가하는 동안 상속 된 유형을 제한과 혼합하는 데 실제로 필요한 사항에 대해 더 자세한 설명과 함께 내 예제를 제안하고 싶습니다.

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

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

이것은 개인 유형 (제 경우에는 "string1024Type")을 기반으로 요소가 정의되고 필요한 속성이 추가 된 위치입니다.

<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>

두 블록 모두 스키마에서 완전히 분리 된 위치에있을 수 있습니다. 중요한 점은 다시 한 번만 따라가는 것입니다. 동일한 요소 정의에서 상속과 속성을 혼합 할 수 없습니다.

참고URL : https://stackoverflow.com/questions/626319/add-attributes-to-a-simpletype-or-restriction-to-a-complextype-in-xml-schema

반응형