XSD 条件元素

XSD conditional element

我正在学习中XSD。我想将我的 DTD 转换为 XSD,以便利用 XSD 的可能性。我 运行 遇到以下问题:

我要转换的DTD读取(部分):

<!ELEMENT author ((first|(first, middle))?, last, suffix?)>

这里的想法是,只有在有 first 元素(即,如果没有名字,则没有中间名姓名)。

我通过 Oxygen XML 编辑器将此 DTD 转换为 XSD,它给出了以下内容:

  <xs:element name="author">
    <xs:complexType>
      <xs:sequence>
        <xs:choice minOccurs="0">
          <xs:element ref="first"/>
          <xs:sequence>
            <xs:element ref="first"/>
            <xs:element ref="middle"/>
          </xs:sequence>
        </xs:choice>
        <xs:element ref="last"/>
        <xs:element minOccurs="0" ref="suffix"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

但是 Oxygen (Xerces) 使用的验证引擎抛出以下关于这部分的错误:

first and first (or elements from their substitution group) violate "Unique Particle Attribution".

所以我的问题是:在 XSD 中表达我的 DTD 的正确方法是什么?如何在不违反“唯一粒子属性”的情况下表达我想对 middle 元素施加的约束?

在此先感谢您的帮助!

像这样重写author的内容模型,

  <xs:element ref="author">
    <xs:complexType>
      <xs:sequence>
        <xs:sequence minOccurs="0">
          <xs:element ref="first"/>
          <xs:element ref="middle" minOccurs="0"/>
        </xs:sequence>
        <xs:element ref="last"/>
        <xs:element ref="suffix" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

将在不违反唯一粒子属性的情况下表达与 DTD 相同的约束。