2015-05-19 48 views
0

我想創建一個XSD,其中一個項目需要指定至少一個標識符,或兩者都不是none。 這在第一時刻正常工作:XSD「一個或兩個」的選擇不適用於類型限制

<xs:choice> 
<xs:sequence> 
    <xs:element name="OneIdType"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:maxLength value="50"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
    <xs:element name="AnotherIdType" type="xs:string" minOccurs="0"/> 
</xs:sequence> 
<xs:element name="AnotherIdType" type="xs:string"/> 

但兩者IdTypes應該有(不同的)長度的限制。 所以,當我嘗試以下方法我的XSD無效:

<xs:choice> 
<xs:sequence> 
    <xs:element name="OneIdType"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:maxLength value="50"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
    <xs:element name="AnotherIdType" minOccurs="0"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:maxLength value="20"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
</xs:sequence> 
<xs:element name="AnotherIdType"> 
    <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:maxLength value="20"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

我得到的錯誤

元素 'AnotherIdType' 不符合元素「AnotherIdType的一致。

那麼在XSD中是否有可能實現限制類型的「one or both choice」?

感謝, 最大

回答

1

雖然這兩個AnotherIdType元素聲明中的匿名類型具有相同的定義,它們不是同一類型。拉出simpleType聲明頂級

<xs:simpleType name="max20String"> 
    <xs:restriction base="xs:string"> 
     <xs:maxLength value="20"/> 
    </xs:restriction> 
</xs:simpleType> 

,然後從兩個元素引用它

<xs:choice> 
<xs:sequence> 
    <xs:element name="OneIdType"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:maxLength value="50"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
    <xs:element name="AnotherIdType" type="tns:max20String" minOccurs="0"/> 
</xs:sequence> 
<xs:element name="AnotherIdType" type="tns:max20String"/> 

(其中tns前綴被綁定到架構的targetNamespace

+0

是,並嘗試避免用'Type'後綴命名*元素*。 – kjhughes

+0

謝謝,伊恩,工作。 「類型」僅僅是這裏的例子。在我真正的XSD中,他們有更好的名字。 – Max

相關問題