XML 스키마 열거로 특성을 제한하는 방법
다음 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>
가격 정의에서 숫자 값이 누락 된 것 같습니다. 다음을 시도하십시오.
<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>
이전 질문에 대한 새로운 답변
이 오래된 질문에 대한 기존 답변 중 실제 문제를 해결하는 것은 없습니다.
진짜 문제 는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>
노트
- As commented by @Paul, these do change the content type of
price
fromxs:string
toxs:decimal
, but this is not strictly necessary and was not the real problem. - As answered by @user998692, you could separate out the definition of currency, and you could change to
xs:decimal
, but this too was not the real problem.
The real problem was that xs:complexType
cannot directly have a xs:extension
as a child in XSD; xs:simpleContent
is needed first.
A related matter (that wasn't asked but may have confused other answers):
How could price
be restricted given that it has an attribute?
In this case, a separate, global definition of priceType
would be needed; it is not possible to do this with only local type definitions.
How to restrict element content when element has attribute
<?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>
you need to create a type and make the attribute of that type:
<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>
then:
<xs:complexType>
<xs:attribute name="currency" type="curr"/>
</xs:complexType>
<xs:element name="price" type="decimal">
<xs:attribute name="currency" type="xs:string" value="(euros|pounds|dollars)" />
</element>
This would eliminate the need for enumeration completely. You could change type to double if required.
참고URL : https://stackoverflow.com/questions/8925706/xml-schema-how-to-restrict-attribute-by-enumeration
'program tip' 카테고리의 다른 글
Ubuntu의 Apache 서버 벤치마킹 도구 AB를 포함하는 패키지는 무엇입니까? (0) | 2020.09.25 |
---|---|
C libcurl은 출력을 문자열로 가져옵니다. (0) | 2020.09.25 |
JAXB가 xsd : dateTime을 마샬링 할 때 사용되는 날짜 형식을 어떻게 지정합니까? (0) | 2020.09.25 |
gdb : 현재 줄을 인쇄하거나 현재 줄 번호를 찾는 방법은 무엇입니까? (0) | 2020.09.25 |
양식없이 파일 업로드 (0) | 2020.09.25 |