2013-06-17 2 views
0

목표 : 요소 "건너 뛰기"가 임의의 순서로 요소를 포함 할 수 있고 오류없이 내 xml의 유효성을 검사 할 수있는 complexType을 만듭니다.과 일치하는 와일드 카드 오류

스키마 :

<skip> 
    <anyelement1></anyelement1> 
    <anyelement2></anyelement2> 
    <anyelementN></anyelementN> 
</skip> 
:

<?xml version="1.0" encoding="UTF-8"?> 

<xs:schema 
    xmlns="http://www.example.com/main" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.com/main" 
    attributeFormDefault="unqualified" 
    elementFormDefault="qualified" 
    > 

    <xs:complexType name="skip"> 
    <xs:sequence> 
     <xs:any minOccurs="1" 
       maxOccurs="unbounded" /> 
    </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

내가

<?xml version="1.0" encoding="UTF-8"?> 

<xs:schema 
    xmlns:esc="http://www.escmatrix.com/main" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.com/main" 
    attributeFormDefault="unqualified" 
    elementFormDefault="qualified" 
    > 

    <xs:include 
     schemaLocation="http://www.example/skip" /> 

    <xs:element name="tasks"> 
     <xs:complexType> 
     <xs:choice minOccurs="0" 
        maxOccurs="unbounded" > 
      <xs:element name="skip" 
         type="esc:skip" /> 
     </xs:choice> 
     </xs:complexType> 
    </xs:element> 
<xs:schema> 

내가 형태를 가질 수있다 XML의 유효성을 검사 할 필요가 내 main.xsd에 skip.xsd를 가져 skip.xsd

문제점 : 유효성을 검사 할 때 오류가 발생했습니다. "cvc-complex-type.2.4.c : 일치하는 와일드 카드는 엄격하지만 아무런 선언도 찾을 수 없습니다. 요소 'anyelement1'"

답변

4

표시 한 스키마 문서에 오류 메시지가 표시되면 ; 귀하의 첫 번째 문제는 귀하의 스키마 문서가 skip.xsd라는 이름을 갖기를 기대하지만 해당 xs : include의 schemaLocation 속성은 http://example.com/skip을 가리키고 건너 뛰기 유형이 네임 스페이스 http://www.example.com/main에 있다는 두 번째 문제점을 지적합니다. 그러나 skip 요소에 대한 선언은 네임 스페이스 http://escmatrix.com/main에있는 유형을 참조합니다. 그러나 나는 이것들이 질문에 대한 당신의 예제 코드를 줄이는 데있어서 단지 사무적인 오류라고 생각합니다.

오류 메시지는 매우 명확합니다. 와일드 카드가 엄격한 와일드 카드로 해석되므로 일치하는 요소에 선언이 있어야하며 그렇지 않은 경우 문서가 유효하지 않습니다. 와일드 카드는 processContents 속성을 지정하지 않았기 때문에 엄격한 값이며, 기본값은 processContents이며 strict입니다. 선언되지 않은 요소를 허용하려면 processContents="lax" 또는 processContents="skip" 중 하나를 지정해야합니다. 선언이있는 요소의 유효성을 검사하려면 lax 와일드 카드를 사용하고 그렇지 않은 경우 건너 뛸 와일드 카드를 사용해야합니다 모든 경우에 유효성을 검사합니다.이 경우 어린이는 잘 구성되어있는 한 skip 요소가 유효합니다. 당신은 "내 XML을 모든 경우에 유효한 것으로 받아 들인다"는 것을 의미하는 "오류없이 XML 유효성 검사"스키마를 원한다고 말합니다 (프로세서가 이미 올바르지 만 성공적으로 입력의 유효성을 실패없이 확인하기 때문에 이미 XML없이 오류없이 유효성을 검사하므로 스킵 와일드 카드가 필요한 것처럼 보입니다.

+0

이 문제에 대한 정답입니다. 나중에 스키마를 수정하려고 할 때 동일한 오류가 발생했습니다. 내 솔루션을 게시하려고하는데 토론은 여기에서 찾을 수 있습니다. http://stackoverflow.com/questions/17173766/allowing-any-elements-from-a-particular-namespace-with-two-schemas 감사합니다. – Jefftopia