2013-10-24 102 views
0

我想寫一個XML Schema用於驗證通過以下XML代碼描述的線路特性:XML架構集

<linecharacteristics> 
    <characteristic name = "color" value = "red" /> 
    <characteristic name = "style" value = "dashed" /> 
    ... 
    <characteristic name = "thickness" value = "medium" /> 
</linecharacteristics> 

有多種特性,這是XML架構的代碼,我到目前爲止:

<xs:element name="linecharacteristics"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="characteristic" minOccurs="0" maxOccurs="unbounded"> 
      <xs:complexType> 
       <xs:attribute name="name" type="xs:string" use="required"/> 
       <xs:attribute name="value" type="xs:string" use="required"/> 
      </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

我想弄清楚的是如何檢查屬性是否正確。例如,「名稱」屬性可以說'顏色','風格'和'厚度',但不是'形狀'。此外,如果「name」屬性表示「顏色」,則「值」只能包含「紅色」,「黃色」,「綠色」而不是「虛線」。 '虛線'值僅與名稱'樣式'相關聯。那麼如何定義可接受的屬性值集?

感謝您的幫助!

回答

2

如果您使用的是XSD 1.1,您可以使用聲明來管理它。如果您使用的是XSD 1.0,則需要使用Schematron之類的東西,或者直接使用傳統的編程語言編寫約束條件。使用XSD 1.1,您可以將複雜類型編寫爲:

<xs:element name="linecharacteristics"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="characteristic" minOccurs="0" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:attribute name="name" type="xs:string" use="required"/> 
        <xs:attribute name="value" type="xs:string" use="required"/> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
     <xs:assert test="(
      (@name = 'color') and @value = ('red', 'green', 'yellow') or 
      (@name = 'style') and @value = ('dashed') 
      )"></xs:assert> 

    </xs:complexType> 
</xs:element> 
0

您只能部分地完成您所要求的模式驗證。您可以檢查名稱是否包含正確的值,但不能告訴它檢查值是否與給定的結構名稱相符(請參見下文)。要驗證它們是否匹配集合,您必須使用XSLT /業務規則/自定義代碼。

<xs:element name="linecharacteristics"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element minOccurs="0" maxOccurs="unbounded" name="characteristic"> 
      <xs:complexType> 
       <xs:attribute name="name" use="required"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
        <xs:enumeration value="color" /> 
        <xs:enumeration value="style" /> 
        <xs:enumeration value="thickness" /> 
        </xs:restriction> 
       </xs:simpleType> 
       </xs:attribute> 
       <xs:attribute name="value" use="required"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
        <xs:enumeration value="red" /> 
        <xs:enumeration value="yellow" /> 
        <xs:enumeration value="green" /> 
        <xs:enumeration value="dashed" /> 
        <xs:enumeration value="medium" /> 
        </xs:restriction> 
       </xs:simpleType> 
       </xs:attribute> 
      </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element>