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

use*_*281 6 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>
Run Code Online (Sandbox Code Playgroud)

...

  • RequestType:枚举2个值R1和R2

  • FieldNameType:2个值F1和F2的枚举

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

  1. 当RequestType = R1时,则Alowed Fields名称为F1和F2
  2. 当Request Type = R2时,允许的字段名称为F1,F3和F4.(可能需要新的枚举)

我该如何添加此类验证?谢谢.

C. *_*een 7

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

因此,在您描述时,使XSD验证您的请求的最简单方法是searchcriteria使用名为R1和的一对元素替换您的元素R2.声明他们有不同的类型,如你所愿:要么他们每个人都有命名的元素filter与携带适当的枚举类型的属性,或者R1被声明为具有或者一个F1F2一个孩子,R2被声明为的选择F1,F3F4.

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

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

另请参阅这个基本相似的问题,以便通过示例对选项进行更具体的讨论.