例如,假设橙色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。
答案 0 :(得分:1)
您的约束无法在XSD 1.0中表示。
您的约束可以使用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>