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




xml xsd 변환 (4)

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

이렇게하면 열거를 완전히 제거 할 필요가 없습니다. 필요한 경우 유형을 이중으로 변경할 수 있습니다.

다음 XML 태그가 있습니다.

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

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

  • 유로
  • 파운드
  • 불화

그리고 가격은 두 배입니까?

두 가지 유형을 모두 시도 할 때 오류가 발생합니다. 여기까지가 있습니다.

<xs:element name="price">
    <xs:complexType>
        <xs:attribute name="currency" type="xs:string">
            <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>

Answer #1

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

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

Answer #2

유형을 작성하고 해당 유형의 속성을 작성해야합니다.

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

Answer #3

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

이 낡은 질문에 대한 기존 답변은 실제 문제를 해결하지 못합니다.

진짜 문제xs:complexType 이 XSD에서 자식으로 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>

노트

  • @Paul의해 주석 된 바와 같이, 이것들은 price 의 내용 유형을 xs:string 에서 xs:decimal 로 변경하지만, 이것은 꼭 필요한 것은 아니며 실제 문제는 아닙니다.
  • @ user998692에 의해 답변 됨에 따라 통화 정의를 분리 할 수 ​​있으며 xs:decimal 변경할 수 있지만 이는 실제 문제가 아닙니다.

진짜 문제xs:complexType 이 XSD에서 자식으로 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>




xsd