XML元素的值取决于XSD中其他元素的值吗?

时间:2017-02-27 20:58:17

标签: xml xsd xsd-validation xml-validation

例如,假设橙色GMC卡车价值20,000美元,而白色和黑色GMC卡车价值10,000美元。

给出以下XML:

<example>
    <car>
        <make value='GMC'/>
        <model value='Truck'/>
        <configuration>
            <color value="orange"/>
            <bed value="short"/>
            <cab value="regular"/>
        </configuration>
        <price value='10000'/>
    </car>
</example>

XML告诉我,我的销售人员正在以10,000美元的价格出售带有普通驾驶室的橙色GMC短卡车。我想使用架构来防止我的员工以低于20,000美元的价格出售卡车。

我是否可以创建一个XSD文件来强制限制汽车必须是GMC,卡车,橙色,价格为20,000美元。换句话说,我可以对四个独立元素的值进行限制吗?

示例XML无法验证,因为价格低于20,000美元,或者因为颜色是橙色而不是白色或黑色。取决于你想如何看待它。

更新

根据http://www.ibm.com/developerworks/library/x-xml11pt2/

  

不幸的是,XML Schema 1.0没有提供强制执行这些功能的方法   规则。要实现这样的约束,你可以

     
      
  • 在应用程序级别编写代码(在XML架构验证之后)
  •   
  • 使用样式表检查(也是后验证过程)
  •   
  • 使用其他XML架构语言,例如RelaxNG或Schematron
  •   
     

持续请求共现约束检查   来自XML Schema 1.0用户社区的支持,即XML Schema 1.1   工作组介绍了断言和类型的概念   XML Schema 1.1中的替代方案,允许XML模式作者表达   这样的限制。

好的,所以看看我目前的环境,我正在使用不支持XSD 1.1的lxml。所以,我将不得不使用Schematron或RelaxNG。

1 个答案:

答案 0 :(得分:1)

XSD 1.0

您的约束无法在XSD 1.0中表示。

XSD 1.1

您的约束可以使用XSD 1.1中的断言表示:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
           vc:minVersion="1.1">
  <xs:element name="example">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="car">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="make" type="valAttrType"/>
              <xs:element name="model" type="valAttrType"/>
              <xs:element name="configuration">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="color" type="valAttrType"/>
                    <xs:element name="bed" type="valAttrType"/>
                    <xs:element name="cab" type="valAttrType"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="price" type="valAttrType"/>
            </xs:sequence>
            <xs:assert test="not(    make/@value='GMC' 
                                 and model/@value='Truck' 
                                 and configuration/color/@value='orange')
                              or number(price/@value)=20000"/>
            <xs:assert test="not(    make/@value='GMC' 
                                 and model/@value='Truck' 
                                 and configuration/color/@value='black')
                              or number(price/@value)=10000"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="valAttrType">
    <xs:attribute name="value" type="xs:string"/>
  </xs:complexType>
</xs:schema>