2013-03-20 3 views
1

는 그같은 요소 이름,하지만 서로 다른 유효성 검사 논리

<doc> 
<field name="simple_meta">book</field> 
<field name="complex_meta">journal</field> 
<field name="text_date">some text</field> 
</doc> 

내가 속성 "이름"의 값을 기준으로 패턴 요소 텍스트를 확인하려는 것 같다 XML 파일이 있습니다. 즉, 속성의 값이 "simple_meta"인 경우 "complexRestriction"유효성 검사를 수행하기 위해 "complex_meta"의 경우 "simpleRestriction"유효성 검사를 수행하려고합니다. 문제는 동일한 노드 아래에 같은 이름의 요소를 정의 할 수 없다는 것입니다. 누군가이 문제를 해결할 수 있도록 도와 줄 수 있습니까?

<xs:schema ......> 
    <xs:simpleType name="simpleRestriction"> 
     <xs:restriction base="xs:string"> 
     <xs:maxLength value="20"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="complexRestriction"> 
     <xs:restriction base="xs:string"> 
     <xs:maxLength value="10"/> 
     <xs:pattern value="([\w])*"/> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:element name="str"> 
     <xs:complexType> 
     <xs:simpleContent> 
      <xs:extention base="simpleRestriction"> 
       <xs:attribute name="name"> 
        <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="simple_meta"/> 
        </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extention> 
     </xs:simpleContent> 
     </xs:ComplexType> 
    </xs:element> 
    <xs:element name="str"> 
     <xs:complexType> 
     <xs:simpleContent> 
      <xs:extention base="complexRestriction"> 
       <xs:attribute name="name"> 
        <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="complex_meta"/> 
        </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extention> 
     </xs:simpleContent> 
     </xs:ComplexType> 
    </xs:element> 
</xs:schema> 
+1

XSD 1.0에서는이 작업을 수행 할 수 없습니다. 다른 시스템 (Schematron 또는 RelaxNG 또는 XSD 1.1 일 수도 있지만 익숙하지 않음) – MiMo

답변

1

짧은 대답은 :하지 마세요.

XSD는 요소의 이름에 주로 (그리고 단순한 경우에만) 요소의 유효성을 검사하도록 설계되었습니다. 세 가지 다른 유효성 검증 로직이 있다면 XSD 유효성 검사기에 요소의 유형이 하나임을 주장하는 대신 세 가지 유형의 요소 (아마도 simple_meta, complex_meta 및 test_date)가 있음을 알리는 것이 좋습니다. 공통 기본 유형을 사용하여 세 요소의 유형 간 관계를 명시 적으로 지정하거나 공통 대체 그룹을 사용하여 세 요소 유형 자체를 관련 시키십시오.

정말로 그렇게해야한다면, 아니면 내가하고있는 일을 알고 있고 그것을하고 싶다면 (나는 그 조합이 가능할지는 모르겠지만 여기서는 폭 넓은 생각을하려고 노력할 것입니다)

  • 인스턴스의 각 요소의 유형을 지정 인스턴스의

    • 사용 xsi:type (당신의 name 속성 대략 비슷하지만 이름은 형식은 스키마에 선언) : 기본적인 옵션은 XSD 1.1 및 조건부 유형 지정 사용

    • 뒤에
    • 사용 XSD 1.1 및 주장

    또는 떠나 XSD :

    • 사용 스키마 트론과 주장

    • 사용 RelaxNG 및 컨텐츠 모델에 속성의 서로 다른 값을 기록