【问题标题】:How to add conditional validation in XSD :如何在 XSD 中添加条件验证:
【发布时间】:2013-05-24 16:17:13
【问题描述】:

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

如何添加此类验证? 谢谢。

【问题讨论】:

    标签: xsd-validation


    【解决方案1】:

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

    因此,按照您的描述,让 XSD 验证您的请求的最简单方法是将您的 searchcriteria 元素替换为一对名为 R1R2 的元素。根据需要用不同的类型声明它们:它们每个都有一个名为 filter 的元素,其属性带有适当的枚举类型,或者 R1 被声明为具有 F1F2 作为孩子,并且R2 被声明为可以选择F1F3F4

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多