XML 스키마 열거로 특성을 제한하는 방법


85

다음 XML 태그가 있습니다.

<price currency="euros">20000.00</price>

통화 속성을 다음 중 하나로 제한하려면 어떻게합니까?

  • 유로
  • 파운드
  • 불화

그리고 가격은 두 배로?

둘 다 유형을 시도 할 때 오류가 발생합니다. 지금까지 얻은 내용은 다음과 같습니다.

<xs:element name="price">
    <xs:complexType>
        <xs:attribute name="currency">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="pounds" />
                    <xs:enumeration value="euros" />
                    <xs:enumeration value="dollars" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:element>

1
이렇게하려면 <xs : attribute> 요소에서도 type = "xs : string"을 제거해야합니다. simpleType 또는 complexType이있는 경우 유형을 제공 할 수 없습니다.
Sal

답변:


116

가격 정의에서 숫자 값이 누락 된 것 같습니다. 다음을 시도하십시오.

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>



<xs:element name="price">
        <xs:complexType>
            <xs:extension base="xs:decimal">
              <xs:attribute name="currency" type="curr"/>
            </xs:extension>
        </xs:complexType>
</xs:element>

3
@kjhughes가 대답했듯이은 <xs:extension직접 자식이 될 수 <xs:complexType없지만 대신 <xs:complexContent또는에 포함되어야합니다 <xs:simpleContent.
HankCa

22

이전 질문에 대한 새로운 답변

이 오래된 질문에 대한 기존 답변 중 실제 문제를 해결하는 것은 없습니다.

진짜 문제 는XSD에서 아이를xs:complexType직접 가질 수 없다는 것xs:extension입니다. 수정은xs:simpleContent먼저사용하는 것입니다. 자세한 내용은 다음과 같습니다.


XML,

<price currency="euros">20000.00</price>

다음 수정 된 XSD 중 하나 에 대해 유효합니다 .

로컬에서 정의 된 속성 유형

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

전역 적으로 정의 된 속성 유형

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="currencyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="pounds" />
      <xs:enumeration value="euros" />
      <xs:enumeration value="dollars" />
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency" type="currencyType"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

메모

  • 따라 @ 폴에 의해 주석 , 이들의 콘텐츠 형식 변경 할 price에서 xs:string대상을 xs:decimal, 그러나 이것은 반드시 필요한 것은 아니며, 진짜 문제가 아니었다.
  • @ user998692가 대답 했듯이 통화의 정의를 분리하고로 변경할 수 xs:decimal있지만 이것도 실제 문제는 아닙니다.

진짜 문제 는 XSD에서 아이를 xs:complexType직접 가질 수 없다는 xs:extension것입니다. xs:simpleContent먼저 필요합니다.

관련 문제 (요청되지 않았지만 다른 답변을 혼동했을 수 있음) :

price속성이 있다는 것을 어떻게 제한 할 수 있습니까?

이 경우 별도의 전역 정의 priceType가 필요합니다. 로컬 유형 정의만으로는이를 수행 할 수 없습니다.

요소에 속성이있을 때 요소 콘텐츠를 제한하는 방법

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="priceType">  
    <xs:restriction base="xs:decimal">  
      <xs:minInclusive value="0.00"/>  
      <xs:maxInclusive value="99999.99"/>  
    </xs:restriction>  
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="priceType">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

8

유형을 만들고 해당 유형의 속성을 만들어야합니다.

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>

그때:

<xs:complexType>
    <xs:attribute name="currency" type="curr"/>
</xs:complexType>

안녕하세요, 슬프게도 이것은 가격 유형을 "이중"으로 제한하고 "통화"속성에 대한 제한 열거를 동시에 제한하는 것을 허용하지 않습니다
Luke

-2
<xs:element name="price" type="decimal">
<xs:attribute name="currency" type="xs:string" value="(euros|pounds|dollars)" /> 
</element> 

이것은 열거의 필요성을 완전히 제거합니다. 필요한 경우 유형을 double로 변경할 수 있습니다.


@value에 나타날 수 없습니다 xs:attribute. xs:attribute의 하위로 나타날 수 없습니다 xs:element. 필요한 xs:네임 스페이스 접두사는 생략됩니다. 이 답변은 엉망이므로 삭제해야합니다.
kjhughes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.