现有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以提供以下验证:
我如何添加此类验证? 感谢。
答案 0 :(得分:6)
XSD(以及大多数其他XML模式语言)的基本思想是将验证行为绑定到元素类型。如果你想要以一种方式验证一组实例,而另一种方式验证另一组实例(实现这个想法),那么表面上证明它们实际上是两种不同类型的元素,并且应该有两个不同的名称。
因此,在您描述时,让XSD验证您的请求的最简单方法是将您的searchcriteria
元素替换为一对名为R1
和R2
的元素。根据需要用不同的类型声明它们:要么它们都有一个名为filter
的元素,其属性带有适当的枚举类型,要么R1
被声明为具有F1
或者F2
{child} R2
被宣布为F1
,F3
或F4
。
如果您不能或不会这样做,您可以使用XSD 1.1及其条件类型赋值功能为searchcriteria
声明两种类型(否则您将用于R1
的两种类型}和R2
)并根据Request
属性的值分配适当的类型。您还可以在searchcriteria
上使用断言来检查共同约束。
如果您无权访问XSD 1.1验证程序,请告知XSD 1.0验证程序的供应商您要升级,并探索使用Schematron断言来检查约束。
有关选项的更具体讨论,请参阅this essentially similar question,并附带示例。