如何在XSD中添加条件验证:

时间:2013-05-29 11:59:31

标签: xsd-validation

现有XSD代码段:

<xs:element name="searchcriteria">
   <xs:complexType>
     <xs:sequence>  
       <xs:element ref="filter" 
                   minOccurs="0" 
                   maxOccurs="unbounded" />
     </xs:sequence>
     <xs:attribute name="Request" 
                   type="RequestType" />
   </xs:complexType>
 </xs:element>  


<xs:element name="filter">
   <xs:complexType>
     <xs:sequence>
       <xs:element ref="filter" 
                   minOccurs="0" 
                   maxOccurs="unbounded" />
     </xs:sequence>
     <xs:attribute name="FieldName" 
                   type="FieldNameType" />
    </xs:complexType>
 </xs:element>

...    

  • RequestType:枚举2个值R1和R2

  • FieldNameType:2个值F1和F2

  • 的枚举

现在我想修改此XSD以提供以下验证:

  1. 当RequestType = R1时,则Alowed Fields名称为F1和F2
  2. 当请求类型= R2时,允许的字段名称为F1,F3和F4。 (可能需要新的枚举)
  3. 我如何添加此类验证? 感谢。

1 个答案:

答案 0 :(得分:6)

XSD(以及大多数其他XML模式语言)的基本思想是将验证行为绑定到元素类型。如果你想要以一种方式验证一组实例,而另一种方式验证另一组实例(实现这个想法),那么表面上证明它们实际上是两种不同类型的元素,并且应该有两个不同的名称。

因此,在您描述时,让XSD验证您的请求的最简单方法是将您的searchcriteria元素替换为一对名为R1R2的元素。根据需要用不同的类型声明它们:要么它们都有一个名为filter的元素,其属性带有适当的枚举类型,要么R1被声明为具有F1或者F2 {child} R2被宣布为F1F3F4

如果您不能或不会这样做,您可以使用XSD 1.1及其条件类型赋值功能为searchcriteria声明两种类型(否则您将用于R1的两种类型}和R2)并根据Request属性的值分配适当的类型。您还可以在searchcriteria上使用断言来检查共同约束。

如果您无权访问XSD 1.1验证程序,请告知XSD 1.0验证程序的供应商您要升级,并探索使用Schematron断言来检查约束。

有关选项的更具体讨论,请参阅this essentially similar question,并附带示例。