如何实现条件模式验证

时间:2013-06-04 18:36:00

标签: xml xsd schema keyref

如何实现可满足以下要求的架构验证

<test>
  <e1>abc</e1>
  <e2>
     <e21>xxx</e21>
     <e22>yyy</e22>
  </e2>
</test>

所以我的要求是如果e21不为null,e22不能为null,那么我如何设计我的xsd架构

1 个答案:

答案 0 :(得分:1)

如果e21不为空,则要求“e22不能为空”意味着,我认为e21和e22都是空的,或者两者都不是。

如果通过不存在元素来传达e21和e22的空值,那么简单的内容模型可以解决这个问题:

<complexType name="e2">
  <sequence minOccurs="0" maxOccurs="1">
    <element ref="e21"/>
    <element ref="e22"/>
  </sequence>
</complexType>

这里e21和e22都存在于文档中,或者两者都不存在。

如果您还想允许e21不存在(null)且e22不存在的情况,则将序列更改为

  <sequence minOccurs="0" maxOccurs="1">
    <element ref="e21" minOccurs="0"/>
    <element ref="e22"/>
  </sequence>

如果“为空”表示“空”,则无法在XSD 1.0中强制执行约束;在XSD 1.1中,您可以使用断言来表达和实施相对复杂的约束。在XSD 1.1中查找有关共约束和断言的Stack Overflow问题。