0

我正在尝试编写一个 XML Schema 来验证以下 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”是“color”,那么“values”只能包含“red”、“yellow”、“green”,不能包含“dashed”;“虚线”值仅与名称“样式”相关联。那么如何定义可接受的属性值集呢?

谢谢你的帮助!

4

2 回答 2

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>
于 2013-10-25T07:26:06.967 回答
0

您只能通过模式验证部分完成您所要求的工作。您可以检查名称是否包含正确的值,但不能告诉它检查该值是否与您概述的结构的名称匹配(见下文)。要验证它们是否匹配集,您必须使用 XSLT/Business Rules/Custom Code。

    <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>
于 2013-10-24T23:16:11.983 回答