2012-08-09 72 views
4

我正在開發一個XSD文檔來驗證XML導入文件。幾乎導入文件'可以'的所有元素都有一個ID屬性(UPDATE)。更新屬性必須限制在4個可能的值,因此我有這個預先設定的類型用於屬性限制...帶屬性和限制的XSD自定義類型

<xs:simpleType name="MyUpDir"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value="OVERWRITE"/> 
    <xs:enumeration value="ADDONLY" /> 
    <xs:enumeration value="NOERASE" /> 
    <xs:enumeration value="IGNORE" /> 
    </xs:restriction> 
</xs:simpleType> 

除了屬性的限制,每個元素的值是由各種限制的預先設定的定製類型 實施例:

<xs:simpleType name="MyChar50"> 
    <xs:restriction base="xs:string"> 
    <xs:maxLength value="50" /> 
    </xs:restriction> 
</xs:simpleType> 

將二者結合起來,我知道可以如下做到這一點在在線的每個元素:

<xs:element name="FullName"> 
    <xs:complexType> 
    <xs:simpleContent> 
     <xs:extension base="MyChar50"> 
     <xs:attribute name="UPDATE" type="MyUpDir" /> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

問題是導入文件中有超過1000個元素,每個元素具有不同的長度/ regEx /精度限制(大約20個自定義類型),並且可能具有UPDATE屬性。如果沒有UPDATE屬性,我可以通過使用自定義類型在自己的行上執行每個元素,從而大大減少XSD的「內容」部分。但從我讀過的內容來看,似乎爲了適應自定義類型和提到的屬性的潛力,我不得不使用擴展樣本(最後一個示例),而不是爲每個這樣的元素保留一行。有沒有辦法通過創建一個結合了兩者的自定義類型來進一步減少這種情況?

回答

0

我認爲你可以做更多的20個自定義類型(總共40),然後使用適當的(W /或W/O屬性)。在你的情況下:

<xs:complexType name="MyChar50Attr"><!-- This one has attributes --> 
    <xs:simpleContent> 
     <xs:extension base="MyChar50"> 
      <xs:attribute name="UPDATE" type="MyUpDir"/> 
     </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 
<xs:element name="FullName" type="MyChar50Attr"/> 
+0

足夠簡單...我可以發誓我試過,但得到了某種類型的錯誤,並打折得太早。我想這個錯誤可能是在擴展基礎或其他方面,而不是方法論。下次我會更加關注。 :)謝謝。這完美地工作,並且將使XSD更容易在需要將來更新時進行解密。 – 2012-08-10 15:46:21