用于验证属性值集的XML Schema

时间:2013-10-24 21:01:55

标签: xml xsd

我正在尝试编写一个XML Schema来验证以下XML代码描述的行特征:

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

有多个特征,这是我到目前为止的XML Schema代码:

<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”属性可以表示“颜色”,“样式”和“厚度”,但不能表示“形状”。另外,如果属性“name”表示'color',那么“values”只能包含'red','yellow','green'而不是'dashed'; 'dashed'值仅与名称'style'相关联。那么如何定义可接受的属性值集呢?

感谢您的帮助!

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>