-1

我如何实现可以满足以下要求的模式验证

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

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

4

1 回答 1

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 问题。

于 2013-06-05T15:16:30.247 回答