2010-03-26 2 views
9

이 XSD에 적용되는 XML 파일에 항상 fieldname 또는 freetext 중 하나를 지정해야합니다. 그렇게 할 수있는 방법이 있습니까?XML 스키마에서 두 필드 중 하나가 있어야한다고 지정하는 방법은 무엇입니까?

<xs:complexType name="tSome"> 
<xs:sequence> 
    <!-- either one of the two below has to be present. --> 
    <xs:element name="fieldname" type="xs:string" /> 
    <xs:element name="freetext" type="xs:string" /> 
    <!-- this one below must always be present --> 
    <xs:element name="dbtablename" type="xs:string" /> 
</xs:sequence> 
</xs:complexType> 
+0

정말 미안하지만, 이전 minOccurs 태그는 fieldname과 freetext가 선택 사항 이었기 때문에 거기에만 있습니다. –

답변

17

이 당신이 포함 된 요소 중 하나를 수행 할 수 있도록 XML 스키마에 Choice Indicator 아니지만 두 개 이상의. 당신이 3의 2를 원하는 경우,이 같은 일을 제안 :

<xs:choice> 
    <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" /> 
</xs:choice> 
<xs:choice> 
    <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" /> 
</xs:choice> 

(. 어쩌면 maxOccurs 두 번 하나의 동일한 요소를 선택에서 당신을 방지 할 수 있습니다) 문제가 해결되지 않으면, 아무것도 생각하지 않습니다.

편집 : 처음 질문을 올바르게 이해하지 못했습니다.

<xs:complexType name="tSome"> 
<xs:sequence> 
    <xs:choice> 
    <xs:element name="fieldname" type="xs:string" /> 
    <xs:element name="freetext" type="xs:string" /> 
    </xs:choice> 
    <xs:element name="dbtablename" type="xs:string" /> 
</xs:sequence> 
</xs:complexType> 
+0

정말 고마워! minoccurs와 maxoccur가 선택과 함께 작동하는 방법을 시도해야합니다. 나는 당신의 예가 내가 필요한 것이 아니었지만 나중에 대답을 받아 들인다. 건배! –

+0

미안 : 주말이 일어났습니다 : fieldname 또는 freetext 중 하나만 사용하고 둘 다 사용할 수 없습니다. 항상 dbtablename. 내 편집 된 원래 질문 (minOccurs 태그가 있었던 이유)을 참조하십시오. 내 질문은 지금있다 : minOccurs 태그가 있기 때문에 이제는 실제로 'fieldname 또는 freetext가 아닌 둘 다'인가? 다시 원래의 실수입니다. 당신은 그들이 제거되어야한다고 생각하지 않습니까? –

+0

@matti minOccures = "0"은 아무 것도하지 않으므로 제거 할 수 있습니다. –

4

그래서, 당신도 fieldname 또는 freetext 아니라 모두를 원하는 : 당신이 dbtablename 항상 fieldname 또는 freetext 중 하나에 존재 할 경우,이 대답은? 아니면 둘 다? 그리고 나서 dbtablename 선택적으로?

<xs:choice minOccurs="1" maxOccurs="2"> 
    <xs:element name="fieldname" type="xs:string"/> 
    <xs:element name="freetext" type="xs:string"/> 
    <xs:element name="dbtablename" type="xs:string"/> 
</xs:choice> 

이 당신이 원하는 무엇인가 :

다음은 요소의 1 또는 2? 또는 dbtablename을 분리하고 싶습니까?

+0

미안 : 주말이 일어났습니다 : fieldname 또는 freetext. 항상 dbtablename. 선택의 문제는 xsd.exe가 이상한 코드를 생성한다는 것입니다. –

+0

yes : fieldname 또는 freetext 중 하나이며 둘 다가 아닙니다. –

+0

minOccurs = "1"여기에 maxOccurs = "2"가 표시됩니까? –

관련 문제