programing

XML 스키마 열거형으로 속성을 제한하는 방법

padding 2023. 10. 10. 20:09
반응형

XML 스키마 열거형으로 속성을 제한하는 방법

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

가격 정의에 수치가 누락된 것 같습니다.다음을 시도해 봅니다.

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

기존 질문에 대한 새로운 답변

이 오래된 문제에 대한 기존의 답 중 어떤 것도 진짜 문제를 다루지 않습니다.

진짜 문제는.xs:complexType직접 가질 수 없는xs:extension어린 시절에 XSD에 있었습니다.해결책은 사용하는 것입니다.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>

메모들

  • @Paul에 의해 언급된 바와 같이, 이것들은 컨텐츠 타입을 변화시킵니다.price부터xs:string로.xs:decimal, 하지만 이것은 엄밀하게 필요한 것도 아니고 진짜 문제도 아니었습니다.
  • @user998692에 의해 답변된 것처럼, 당신은 통화의 정의를 분리할 수 있고, 당신은 다음으로 바꿀 수 있습니다.xs:decimal, 하지만 이것 역시 진짜 문제는 아니었습니다.

진짜 문제는.xs:complexType직접 가질 수 없는xs:extension어린 시절 XSD에 있었습니다.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>

유형을 생성하고 해당 유형의 속성을 다음과 같이 만들어야 합니다.

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

언급URL : https://stackoverflow.com/questions/8925706/xml-schema-how-to-restrict-attribute-by-enumeration

반응형