现有的 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>
...
现在我想修改此 XSD 以提供验证:
- 当RequestType = R1时,允许的字段名称为F1和F2
- 当请求类型 = R2 时,允许的字段名称为 F1、F3 和 F4。 (可能需要新的枚举)
我如何添加这样的验证?
谢谢。
XSD(以及大多数其他 XML 模式语言)的基本思想是将验证行为绑定到元素类型。如果您希望一组实例以一种方式验证,另一组实例以另一种方式验证(想法是这样),那么表面证据表明它们实际上是两种不同类型的元素,并且应该有两个不同的名称。
因此,让 XSD 验证您所描述的请求的最简单方法是替换您的searchcriteria
具有一对名为的元素的元素R1
and R2
。根据需要用不同的类型声明它们:或者它们每个都有一个名为的元素filter
具有携带适当枚举类型的属性,或者R1
被声明为具有F1
or an F2
作为一个孩子,并且R2
被宣布为有选择F1
, F3
, or F4
.
如果您不能或不愿意这样做,您可以使用 XSD 1.1 及其条件类型赋值功能来声明两种类型searchcriteria
(否则您会使用的两种类型R1
and R2
)并根据值分配适当的类型Request
属性。您还可以使用断言searchcriteria
检查共同约束。
如果您无法访问 XSD 1.1 验证器,请告诉 XSD 1.0 验证器的供应商您想要升级,并探索使用 Schematron 断言来检查约束。
也可以看看这个本质上相似的问题通过示例对选项进行更具体的讨论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)