2013-10-24 61 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>