如何在 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
元素替换为一对名为 R1
和 R2
的元素。根据需要用不同的类型声明它们:它们每个都有一个名为 filter
的元素,其属性带有适当的枚举类型,或者 R1
被声明为具有 F1
或 F2
作为孩子,并且R2
被声明为可以选择F1
、F3
或F4
。
如果您不能或不想这样做,您可以使用 XSD 1.1 及其条件类型分配功能为 searchcriteria
声明两种类型(否则您将用于 R1
和 @987654335 的两种类型@) 并根据Request
属性的值分配适当的类型。您还可以使用searchcriteria
上的断言来检查共同约束。
如果您无权访问 XSD 1.1 验证器,请告诉 XSD 1.0 验证器的供应商您想要升级,并探索使用 Schematron 断言来检查约束。
另请参阅this essentially similar question,以获取有关选项的更具体讨论,并附有示例。
【讨论】:
以上是关于如何在 XSD 中添加条件验证:的主要内容,如果未能解决你的问题,请参考以下文章