6

现有的 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 时,Allowed Fields 名称为 F1 和 F2
  2. 当请求类型 = R2 时,允许的字段名称为 F1、F3 和 F4。(可能需要新的枚举)

我怎样才能添加这样的验证?谢谢。

4

1 回答 1

7

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

因此,按照您的描述,让 XSD 验证您的请求的最简单方法是将您的searchcriteria元素替换为一对名为R1and的元素R2。用不同的类型声明它们,如你所愿:它们每个都有一个以属性命名的元素filter,该属性带有适当的枚举类型,或者R1被声明为具有 anF1或 anF2作为子级,并被R2声明为可以选择F1F3F4.

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

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

另请参阅这个本质上类似的问题,以更具体地讨论选项,并附上示例。

于 2013-06-01T22:03:54.857 回答