在 XSD 中定义混合元素允许“嵌套”

Defining mixed element in XSD allowing “nesting”

我面临以下问题。我需要为我的 XML 文件创建一个 XSD 模式。假设我有几个 "Conversation Objects" 个节点:

这些是我能够在 XSD 中描述的简单元素(或几乎)。例如我的 End 节点是这样定义的:

<xs:element name="END" type="EndType"/>

<xs:complexType name="EndType" />
    <xs:attribute name="completedMission" type="xs:string"/>
    <xs:attribute name="retry" type="xs:boolean"/>
</xs:complexType>

那我有一个特别的叫:

这种元素的结构如下:

<multipleChoice actor="" numberOfChoices="" percentage=""> message text

    <choice>
        <effects name="" bar="" points="" action="" likelihood="" />
        ...
    </choice>

    <choice>
       <effects name="" bar="" points="" action="" likelihood="" />
       ...
    </choice>

    <choice>
       <effects name="" bar="" points="" action="" likelihood="" />
       ...
    </choice>

</multipleChoice>

所以,第一个问题是:

如何在XSD中定义"multipleChoice"节点(包括属性、文本、"choice"和"effect"节点)?提前致谢!

这个答案怎么样 - 它只适用于 XSD 1.1! 根据@Tarta 的反馈更新。

  <xs:element name="multipleChoice">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="choice"/>
      </xs:sequence>
      <xs:attribute name="actor"/>
      <xs:attribute name="numberOfChoices"/>
      <xs:attribute name="percentage"/>
      <xs:assert test="count(./choice) = @numberOfChoices"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="choice">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="1" ref="effects"/>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element minOccurs="0" maxOccurs="unbounded" ref="Message"/>
          <xs:element minOccurs="0" maxOccurs="unbounded" ref="End"/>
          <xs:element minOccurs="0" maxOccurs="unbounded" ref="YesOrNoAnswer"/>
          <xs:element minOccurs="0" maxOccurs="unbounded" ref="multipleChoice"/>          
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="effects">
    <xs:complexType>
      <xs:attribute name="name"/>
      <xs:attribute name="bar"/>
      <xs:attribute name="points"/>
      <xs:attribute name="action"/>
      <xs:attribute name="likelihood"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="Message">
    <xs:simpleType>
      <xs:restriction base="xs:string"/>
    </xs:simpleType>
  </xs:element>
  <xs:element name="End">
    <xs:simpleType>
      <xs:restriction base="xs:string"/>
    </xs:simpleType>
  </xs:element>
  <xs:element name="YesOrNoAnswer">
    <xs:simpleType>
      <xs:restriction base="xs:string"/>
    </xs:simpleType>
  </xs:element>

这应该为每个 multipleChoice 提供正确数量的选择元素,使用断言来强制执行。 它还允许嵌套元素。

此版本现在以正好 1 个效果元素开始,然后以任意顺序添加 0 个或更多其他元素。