"이러한 요소 중 하나 이상이지만 적어도 하나는 있어야 함"에 대한 XML 스키마 구성

StackOverflow https://stackoverflow.com/questions/100228

  •  01-07-2019
  •  | 
  •  

문제

모든 하위 요소가 선택사항이지만 요소 중 하나 이상이 선택적인 "시퀀스"와 같은 스키마의 일부를 설정하려고 합니다. ~ 해야 하다 존재하며 둘 이상이 있을 수 있습니다.

다음 작업을 시도했지만 XMLSpy에서 "콘텐츠 모델에 고유하게 확인할 수 없는 <element name="DateConstant"> 및 <element name="DateConstant"> 요소가 포함되어 있습니다."라고 불평합니다.

    <xs:choice>
        <xs:sequence>
            <xs:element name="DateConstant"/>
            <xs:element name="TimeConstant"/>
        </xs:sequence>
        <xs:element name="DateConstant"/>
        <xs:element name="TimeConstant"/>
    </xs:choice>

이것이 가능합니까(만약 그렇다면 어떻게)?

몇 가지 설명:동일한 이름의 각 요소 중 하나만 허용하고 싶습니다.하나의 "DateConstant" 및/또는 하나의 "TimeConstant"가 있을 수 있지만 둘 중 하나는 있을 수 없습니다.Gizmo의 답변은 내 요구 사항과 일치하지만 더 많은 수의 요소에는 비실용적입니다.허스트의 대답은 내가 원하지 않는 동일한 이름의 두 개 이상의 요소를 허용합니다.

도움이 되었습니까?

해결책

이 시도:

<xs:choice>
  <xs:sequence>
    <xs:element name="Elem1" />
    <xs:element name="Elem2" minOccurs="0" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:sequence>
    <xs:element name="Elem2" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:element name="Elem3" />
</xs:choice>

이렇게 하면 첫 번째 요소를 선택하고 나머지는 선택 사항이 되고, 두 번째 요소와 나머지는 선택 사항이 되며, 세 번째 요소가 선택됩니다.

이것이 당신이 원하는 대로 이루어지기를 바랍니다.

물론, 하나를 놓친 경우 각 시퀀스의 요소가 중복되는 것을 피하기 위해 하위 시퀀스를 그룹에 배치할 수 있습니다.

다른 팁

MSDN의 기술 문서에 따르면 XML 스키마 이해~에 http://msdn.microsoft.com/en-us/library/aa468557.aspx#understandxsd_topic5다음과 같은 제약 조건을 활용할 수 있습니다. min발생 선택 정의(합성기) 자체에 대해:

"합성기에서 발생 제약 조건을 사용하면 전체 그룹에 전체적으로 적용됩니다."

(중첩된 복합 유형을 사용하는 보다 정교한 예와 AuthorType 예를 참조하세요.)

귀하는 요구 사항을 "적어도 하나의 요소가 있어야 하며 그 중 두 개 이상이 있을 수 있습니다"라고 명시했습니다.따라서 다음을 시도해 보시기 바랍니다.

<xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="DateConstant" type="..."/>
    <xs:element name="TimeConstant" type="..."/>
</xs:choice>

@숲,

불행히도 원래 질문을 이해하지 못했습니다.minOccurs="1"을 선택 항목에 배치하면 minOccurs="0"이 있는 모든 요소가 옵션으로 포함된 경우 자동으로 충족됩니다.

따라서 완전히 선택적인 두 요소의 1회 발생을 정확하게 만족시키는 요소가 없기 때문에 원본 포스터에서 요구하는 "적어도 하나"를 설명하지 못했습니다.

minOccur/maxOccur는 둘 다 정의된 그룹과 관련되어 있고 전체 노드 수와 관련되지 않기 때문에 지금까지 이에 대한 해결책을 찾을 수 없습니다.또한 선택 요소를 사용하여 동일한 명명된 요소를 두 번 이상 정의할 수 없으며 그렇지 않으면 "모호"해집니다.특정 유형의 요소 대신 참조를 사용하는 몇 가지 예를 보았지만 이것이 Microsoft XSD 파서에 실패했다고 생각합니다.

<xs:choice minOccurs="1" maxOccurs="1">
  <xs:sequence minOccurs="1" maxOccurs="1">
    <xs:element name="Elem1" minOccurs="1" maxOccurs="1" />
    <xs:element name="Elem2" minOccurs="0" maxOccurs="1" />
  </xs:sequence>
  <xs:sequence >
    <xs:element name="Elem2" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
</xs:choice>

여기서는 첫 번째 시퀀스(Elem1이 있어야 하지만 선택적으로 Elem2가 있을 수 있음)가 있거나 두 번째 시퀀스(Elem2가 있어야 함)가 있음을 알 수 있습니다.

따라서 이제 이 두 요소 중 "하나 이상"이 있습니다.물론 가능한 모든 조합에 대해 추가 선택 사항을 제공해야 하므로 옵션이 많을수록 이는 기하급수적으로 더 복잡해집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top