2012-05-21 78 views
1

我正試圖在XML模式中進行限制的某種形式的組合。如何將complexType限制爲XML Schema中的特定值?

我有一個complexType這是在其他幾個complexTypes重複使用。我想指定在FullTypeA中包含PartialType時,FieldA必須爲一個值,當包含在FullTypeB中時,其值不同。

<xs:complexType name="PartialType"> 
    <xs:sequence> 
     <xs:element name="FieldA" type="xs:unsignedShort" /> 
     <xs:element name="FieldB" type="xs:unsignedShort" /> 
    </xs:sequence> 
</xs:complexType> 

<!-- FieldA must be 1 for FullTypeA--> 
<xs:complexType name="FullTypeA"> 
    <xs:sequence> 
     <xs:element ref="PartialType" /> 
     <xs:element name="FieldC" type="xs:unsignedShort" /> 
    </xs:sequence> 
</xs:complexType> 

<!-- FieldA must be 2 for FullTypeB--> 
<xs:complexType name="FullTypeB"> 
    <xs:sequence> 
     <xs:element ref="PartialType" /> 
     <xs:element name="FieldD" type="xs:unsignedShort" /> 
    </xs:sequence> 
</xs:complexType> 

我該如何構建我的XML模式以適應這種情況?

回答

1

我認爲Xsd並不真的允許這樣做。

一種可能的方式來實現這一目標將使用xs:restriction

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="PartialType"> 
     <xs:sequence> 
      <xs:element name="FieldA" type="xs:unsignedShort" /> 
      <xs:element name="FieldB" type="xs:unsignedShort" /> 
      <xs:choice> 
       <xs:element name="FieldC" type="xs:unsignedShort" /> 
       <xs:element name="FieldD" type="xs:unsignedShort" /> 
      </xs:choice> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="FullTypeA"> 
     <xs:complexContent> 
      <xs:restriction base="PartialType"> 
       <xs:sequence> 
        <xs:element name="FieldA" type="xs:unsignedShort" fixed="1" /> 
        <xs:element name="FieldB" type="xs:unsignedShort" /> 
        <xs:element name="FieldC" type="xs:unsignedShort" /> 
       </xs:sequence> 
      </xs:restriction> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="FullTypeB"> 
     <xs:complexContent> 
      <xs:restriction base="PartialType"> 
       <xs:sequence> 
        <xs:element name="FieldA" type="xs:unsignedShort" fixed="2" /> 
        <xs:element name="FieldB" type="xs:unsignedShort" /> 
        <xs:element name="FieldD" type="xs:unsignedShort" /> 
       </xs:sequence> 
      </xs:restriction> 
     </xs:complexContent> 
    </xs:complexType> 

</xs:schema> 

這樣做的缺點是顯而易見的:你必須申報所有元素的使用PartialType

另一種方法是使用xs:extension

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="PartialType"> 
     <xs:sequence> 
      <xs:element name="FieldB" type="xs:unsignedShort" /> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="FullTypeA"> 
     <xs:complexContent> 
      <xs:extension base="PartialType"> 
       <xs:sequence> 
        <xs:element name="FieldA" type="xs:unsignedShort" fixed="1" /> 
        <xs:element name="FieldB" type="xs:unsignedShort" /> 
        <xs:element name="FieldC" type="xs:unsignedShort" /> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="FullTypeB"> 
     <xs:complexContent> 
      <xs:extension base="PartialType"> 
       <xs:sequence> 
        <xs:element name="FieldA" type="xs:unsignedShort" fixed="2" /> 
        <xs:element name="FieldB" type="xs:unsignedShort" /> 
        <xs:element name="FieldD" type="xs:unsignedShort" /> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

</xs:schema> 
+0

謝謝你,對我很有幫助! –