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

Posted

技术标签:

【中文标题】如何在 XSD 中添加条件验证:【英文标题】:How to add conditional validation in 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 以提供验证:

    当 RequestType = R1 时,允许的字段名称为 F1 和 F2 当请求类型 = R2 时,允许的字段名称为 F1、F3 和 F4。 (可能需要新的枚举)

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

【问题讨论】:

【参考方案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,以获取有关选项的更具体讨论,并附有示例。

【讨论】:

以上是关于如何在 XSD 中添加条件验证:的主要内容,如果未能解决你的问题,请参考以下文章

如何定义XSD并在XML中使用XSD

如何使用 XSLT 显示 XSD 验证的 XML

如何使用 MSXML 针对 XML Schema.xsd 验证我自己的 Schema XSD 文件?

如何在 C#2.0 中验证 XML 文件

如何根据 XSD 模式验证 XML 结构的单个条目

如何验证XML架构中的命名约定