2011-01-04 8 views
0

요소의 값을 설정하는 데 제약이 있습니다. 내가 설정하고 싶은 규칙에 따라, 다음 요소들의 값 집합이 가능합니다.XML 스키마를 통해 요소 그룹의 값 제한

<tags> 
    <tag>One of Audio, Video, Others.</tag> 
    <tag>For Audio, either Label or Record, For Video, either Studio or Producer, For Others this tag will be empty.</tag> 
    <tag>One of English, Spanish, French</tag> 
</tags> 

지금은 (,)가 일반 텍스트 구분 기호 인 경우 하나의 태그 요소에 대한 내 XSD에서 정규식 패턴 제한을 설정

<element name="tags"> 
    <simpleType> 
     <restriction base="string"> 
      <pattern value="(Audio, (Label|Record)|Video, (Studio|Producer)|Others), (English|Spanish|French)" /> 
     </restriction> 
    </simpleType> 
</element> 

수 있습니다 값을 분리하지만 나는이 있기 때문에 수 있었다 동일한 이름의 tag 요소 시퀀스, 나는 XSD를 통해 그런 식으로 제한하는 것이 가능 할지도 모르겠다. enumeration을 통해 값을 제한 할 수 있다는 것을 알고 있지만 그 값을 그룹화 할 수는 없습니다. 나는 XML은

<tags> 
    <tag>Audio</tag> 
    <tag>Record</tag> 
    <tag>English</tag> 
</tags> 

을 검증하기 위해 다음과 검증을 실패 다음 원하는

<tags> 
    <tag>Others</tag> 
    <tag>Record</tag> 
    <tag>English</tag> 
</tags> 

내 실제 사건은 훨씬 더 복잡 중첩 제한,하지만 난 누군가가 위의 조건에서 도움이 될 수 있습니다, 나는 내가 할 수있는 생각 참조로 받아들이고 내 문제를 해결하십시오.

답변

1

나는 그렇게 생각하지 않습니다. 스키마를 제어 할 수 있다면 왜 검증을 위해이 특정 규칙 집합을 원하십니까? 이 엄격한 유효성 검사가 필요한 정확한 방법으로 필요한 경우 응용 프로그램 수준이 아니라 문서 정의 수준에서 수행해야 할 수 있습니다. 특정 태그의 "유형"에 따라 다른 정보를 태그하는 방법이 정말로 필요합니다. 모든 요소의 목록을 모든 명명 된 태그로 가질 이유가 없습니다. 이미 부모 요소 이름의 태그입니다. 대신 태그 유형을 기준으로 유효성 검사를 수행하려면 다른 요소 유형을 사용해야하며 언제 어디서 어떤 유형이 허용되는지 확인하기 위해 스키마를 구성해야합니다.

<xs:element name="audio"> 
    <xs:complexType> 
     <xs:choice> 
     <xs:element name="Label" type="xs:string"/> 
     <xs:element name="Record" type="xs:string"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="generic"> 
    <xs:choice> 
     <xs:element name="Studio" type="xs:string"/> 
     <xs:element name="Producer" type="xs:string"/> 
    </xs:choice> 
    </xs:complexType> 

    <xs:element name="video" type="generic"/> 
    <xs:element name="other" type="generic"/> 

    <xs:element name="tags"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:choice> 
      <xs:element ref="audio"/> 
      <xs:element ref="video"/> 
      <xs:element ref="other"/> 
     </xs:choice> 
     <xs:element name="language"> 
      <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="English"/> 
       <xs:enumeration value="Spanish"/> 
       <xs:enumeration value="French"/> 
      </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

난 당신이뿐만 아니라 그 유형에 대한 값을 원하는 것이 프로듀서, 레이블, 스튜디오 및 기록을 위해 자유를했다 : 데이터를 저장하기위한이 복잡한 유형 및 선택 모델을 사용하여 수행 할 수 있습니다. 같은에서 파생하는 대신 당신이 substitutionGroups을 사용할 수있는 선택의 여지가 그룹을 사용하는

<xs:complexType name="generic"> 
    <xs:attribute name="meta-type"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="Studio"/> 
      <xs:enumeration value="Producer"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
    </xs:complexType> 

을하지만, 이것은 각 요소를 필요 :하지 않으면, 원래의 경우에 당신은 대신이 같은 부모 요소에 속성을 사용할 수 있습니다 당신이 원하지 않는 유형.

이러한 스키마는 매우 쉽게 확장 할 수 있으며 여전히 엄격한 유효성 검사가 필요없는 일반 < 태그 >의 목록이 필요하면 태그 시퀀스 정의의 일부로 추가 할 수 있습니다.

어쩌면 누군가가 원래 요구 사항에 대한 더 나은 답변을 줄 수 있지만이 정보가 도움이되기를 바랍니다.

+0

좋은 답변 - 문제는 언어의 디자인이 스키마 구현이 아니라는 것입니다. 만약 이것이 정말로 필요하다면, schematron이 유일한 해결책 일 것입니다. –

+0

이것은 정말 좋은 대답이었고 나는 똑같이 할 수 있었지만 슬프게도 다른 요소에 의 구조를 바꿀 수는 없습니다. XSD를 통해서만 공급 업체로부터 들어오는 XML의 유효성을 검사해야합니다. 그리고 유일한 해결책은 정규식 패턴으로 제한된 구분 된 문자열 요소를 선택하는 것 같습니다 ( 시퀀스가 ​​그런 식으로 제한 될 수없는 경우). –

관련 문제