【问题标题】:XSD conditional elementXSD 条件元素
【发布时间】:2021-02-13 23:17:32
【问题描述】:

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

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

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

这里的想法是,只有当存在 first 元素(即,如果没有名字,就没有中间名)时,才可能存在(但不一定是)middle 元素。

我通过 Oxygen XML Editor 将此 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元素施加的约束如何在不违反“唯一粒子属性”的情况下表达?

提前感谢您的帮助!

【问题讨论】:

    标签: xml xsd xsd-validation dtd xml-validation


    【解决方案1】:

    这样重写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 相同的约束,而不会违反唯一粒子属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 2018-10-28
      相关资源
      最近更新 更多