2009-07-15 6 views
2

XML 스키마 문서는 두 항목이 동시에 발생해야한다고 지정할 수 있습니까?XML 스키마가 동시 발생 제약 조건을 지정할 수 있습니까?

예를 들어, 두 개의 선택적 요소가 있으며 둘 다 존재하거나 둘 다 존재하지 않습니다.

a b? c d? e  # giving only {ace, abcde} 
       # instead of all combinations: {ace, acde, abce, abcde} 

<element name="root"> 
    <complexType> 
    <sequence> 
     <element ref="a"/> 
     <element ref="b" minOccurs="0"/> 
     <element ref="c"/> 
     <element ref="d" minOccurs="0"/> 
     <element ref="e"/> 
    <sequence> 
    <complexType> 
<element> 

또 다른 예 :

a b^n c d^n e # where ^n is a superscript denoting number of repeats 
       # giving {ace, abcde, abbcdde, abbbcddde, ...} 
       # but no other combinations 

<element name="root"> 
    <complexType> 
    <sequence> 
     <element ref="a"/> 
     <element ref="b" minOccurs="0" maxOccurs="unbounded"/> 
     <element ref="c"/> 
     <element ref="d" minOccurs="0" maxOccurs="unbounded"/> 
     <element ref="e"/> 
    <sequence> 
    <complexType> 
<element> 

아마의 identity constraints에 뭔가있다 : 두 반복 요소 및 첫 번째가 발생하는 그러나 많은 시간이 있다는 것을, 두 번째는 여러 번 그 발생 XML Schema 스펙을 제공하지만, 이는 두 가지가 동일한 특성을 갖는 것을 보장하기보다는 특정 특성을 가진 인스턴스 하나를 정확하게 얻는 것으로 보입니다.

답변

4

동시 발생은 기존 1.0 스키마 스펙에서 처리 할 수없는 사항 중 하나입니다. 이것이 Schematron이 출시 된 이유 중 하나입니다. 어설 션 기반 유효성 검사는 XPath 표현을 통해 쉽게 표현할 수있는 다른 사례와 함께이 사례를 처리 할 수 ​​있습니다.

또한, 1.1 스키마 spec에는 어설 션 기능이 있지만 아직 1.1에 대한 광범위한 프로세서 지원을 알지 못합니다.

그 주장을 기반으로 검증은 일반적으로 예를 들어, 신용 카드 거래를 중심으로 돌아 가지 고전적인 예 :

우리는 마스터 카드 번호는 '1'비자로 시작 있는지 확인하려면 여기
<card> 
    <number>1111-1111-1111</number> 
    <type>mastercard</type> 
</card> 

'2'로 시작 (물론 실제 대회가 아닙니다). Schema 1.0에서는 그렇게 할 방법이 없지만 (의사 코드로) 어설 션을 통해 쉽게 할 수 있습니다.

<assert test="starts-with(card/type[.='mastercard'],'1')"/> 
+1

Saxon-EE는 완전히 준수하는 XSD 1.1 스키마 프로세서입니다. http : //www.saxonica.com/ –

1

직접 할 수 있는지 확실하지 않습니다. 간단한 옵션은 단일 선택적 요소에 요소를 포함시키고 새 요소의 각 요소를 필요로하는 것입니다.

<element name="root"> 
    <complexType> 
    <sequence> 
     <element ref="a"/> 
     <element ref="c"/> 
     <element ref="f" minOccurs="0"> 
     <complexType> 
      <element ref="b" minOccurs="1"/> 
      <element ref="d" minOccurs="1"/> 
     </complexType> 
     </element> 
     <element ref="e"/> 
    </sequence> 
    </complexType> 
</element> 
+0

감사합니다. 예, 요소가 인접한 특별한 경우에 유용합니다. 반복을 위해서 bbbddd 대신에 bdbdbd를 얻습니다. BTW : 이 모델 그룹 이라는 것을 의미한다고 생각합니다. – 13ren

+0

반복 된 인접 요소의 경우 문맥 자유 문법은 재귀 (A -> b A d)를 사용하여 문맥 자유 문법을 수행 할 수 있지만 사양에 따라 모델 그룹에서 명시 적으로 허용되지 않습니다 (재귀에는 중첩 된 요소가 있어야 함). 그건 그냥 제쳐두고, 인접하지 않은 요소를 포함하여 일반적으로 공동 발생에 관심이 있습니다. 나는 XML 스키마에서 그것을 할 수있는 방법이 있다고 생각하지 않지만, 일부 영리한 사람이 중첩 된 키 참조로 ... (아마도 중첩 된 키 참조로) 작업했을 수도 있습니다 ...? – 13ren

관련 문제