2012-11-07 5 views
1

많은 사이트를 통과 한 다음 Xml 스키마를 만들었습니다. 여기서 다른 특성은 특성 값에 따라 달라집니다.XML 유효성 검사가 다른 특성을 기반으로 하나의 특성을 확인하지 않음

아래의 XML 파일 :

<?xml version="1.0"?> 
<Main> 
    <Matter kind="fruits" calories="10" name="apple" quantity="10" color="red"/> 
    <Matter kind="car" brand="ford" name="ikon" quantity="1" color="red"/> 
    <Matter kind="country" continent="Asia" name="japan"/> 
</Main> 

종류의 속성은 과일, 차 및 국가를 가질 수 있습니다. 그리고 속성에 따라 국가 값과 같이 다른 매개 변수가 필요합니다. 대륙 속성이 필요합니다.

그리고 아래의 XSD 파일입니다

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="Main"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="Matter"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="Matter"> 
    <xs:complexType> 
     <xs:attribute name="name" use="required" type="xs:NCName"/> 
     <xs:alt cond="@kind='fruits'"> 
     <xs:attribute name="kind" use="required" type="xs:NCName" fixed="fruits"/> 
     <xs:attribute name="color" type="xs:NCName"/> 
     <xs:attribute name="quantity" type="xs:integer"/> 
     </xs:alt> 
     <xs:alt cond="@kind='car'"> 
     <xs:attribute name="kind" use="required" type="xs:NCName" fixed="car"/> 
     <xs:attribute name="brand" type="xs:NCName"/> 
     <xs:attribute name="quantity" type="xs:integer"/> 
     <xs:attribute name="color" type="xs:NCName"/> 
     </xs:alt> 
     <xs:alt cond="@kind='country'"> 
     <xs:attribute name="kind" use="required" type="xs:NCName" fixed="country"/> 
     <xs:attribute name="continent" type="xs:NCName" use="required"/> 
     </xs:alt> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

나는 위의 XSD와 XML 파일의 유효성을 검사하고

, 나는 요소 고도가 유효하지 않은 잘못, 또는 너무 자주 발생한다 "고 오류를 얻고있다.

나 적절한 XSD로, 위의 파일을 검증하기 위해 도와주세요

+2

xs : alt는 유효한 XSD 구문이 아닙니다. Xsd는 "모양"의 유효성 만 검사 할 수있는 문서의 내용에 따라 유효성을 검사하지 않습니다. 나는 xs : alt가 스키마의 확장일지도 모른다고 생각한다. 그렇다면 이것을 처리하는 방법을 이해하는 validator를 사용해야한다. XSD에 정의되어 있지 않은 구문 (키워드)을 사용하기 때문에 문서는 유효한 스키마가 아닙니다. – Pawel

답변

1

는 XSL의 아이디어를 어디서 얻었는지 모르겠어요 :..? 고도 XML 스키마의 아마 일부 독점 확장에서

XSD 1.1 표준에는 xs : alternative라는 요소가있는 조건부 유형 할당이라는 기능이 있습니다. XSD 1.1은 최신 버전의 Xerces and Saxon에서 지원됩니다.

+0

나는 XSD를 통해 애트리뷰트 조건 체크를 할 수 없다고 생각한다. DSD http://cs.au.dk/~amoeller/XML/schemas/dsd-example.html에 포인터가있다. – Ayush

+0

사용할 수있는 많은 유효성 검사 기술이 있습니다. DSD는 내가 만나지 않은 것입니다. XSD 경로에 신경 쓰지 않는다면 가장 먼저 볼 수있는 곳은 Relax NG입니다. –

0

다음과 같이 xs:extension을 사용해야합니다.

다음
<?xml version="1.0" encoding="UTF-8"?> 
<Main xmlns="http://www.example.com/matters"> 
    <Fruit calories="10" name="apple" quantity="10" color="red"/> 
    <Car brand="ford" name="ikon" quantity="1" color="red"/> 
    <Car brand="dodge" name="fire" quantity="1" color="blue"/> 
    <Country continent="Asia" name="Japan"/> 
    <Country continent="Europe" name="Italy"/> 
</Main> 

이 XML에 대한 XSD입니다 : 다음은 샘플 XML입니다. 유일한 제한은 동일한 유형의 요소를 순서대로 그룹화해야한다는 것입니다. 고정 속성을 추가 할 수도 있지만 태그 이름이 유형을 나타내므로 필요하지 않습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.example.com/matters" xmlns="http://www.example.com/matters" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <!-- document structure --> 
    <xs:element name="Main"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Fruit" type="fruitType" minOccurs="0" maxOccurs="unbounded" /> 
       <xs:element name="Car" type="carType" minOccurs="0" maxOccurs="unbounded" /> 
       <xs:element name="Country" type="countryType" minOccurs="0" maxOccurs="unbounded" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <!-- types definitions --> 
    <xs:complexType name="matterType"> 
     <xs:attribute name="name" use="required" type="xs:NCName"/> 
    </xs:complexType> 
    <xs:complexType name="fruitType"> 
     <xs:complexContent> 
      <xs:extension base="matterType"> 
       <xs:attribute name="color" type="xs:NCName"/> 
       <xs:attribute name="quantity" type="xs:integer"/> 
       <xs:attribute name="calories" type="xs:integer"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="carType"> 
     <xs:complexContent> 
      <xs:extension base="matterType"> 
       <xs:attribute name="brand" type="xs:NCName"/> 
       <xs:attribute name="quantity" type="xs:integer"/> 
       <xs:attribute name="color" type="xs:NCName"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="countryType"> 
     <xs:complexContent> 
      <xs:extension base="matterType"> 
       <xs:attribute name="continent" type="xs:NCName" use="required"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 
0

한 유형을 다른 유형으로 생성하려고합니다. 나는 당신이 자신의 규칙으로 리팩토링하고 새로운 타입을 만들어야한다고 생각합니다. 그런 다음 원래 수정 된 xsd를 계속 수행하고 한 번에 구문 분석 할 수 있습니다.

<?xml version="1.0"?> 
<Main> 
    <fruits calories="10" name="apple" quantity="10" color="red"/> 
    <car brand="ford" name="ikon" quantity="1" color="red"/> 
    <country continent="Asia" name="japan"/> 
</Main> 
관련 문제