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

时间:2015-06-07 15:52:56

标签: xml xsd

我面临以下问题。我需要创建XML文件的XSD架构。让我们说我有几个"会话对象"节点:

  • 消息
  • 结束
  • YesOrNoAnswer

这是我能够在我的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>

所以,第一个问题是:

  • 必须有相同数量的&#34;选择&#34;在&#34; numberOfChoices&#34;中定义的节点属性
  • &#34;选择&#34;节点必须跟随&#34;效果&#34; node,只包含一些属性
  • &#34;效果&#34;节点可以插入任何其他类型的节点,没有任何顺序和我们想要的次数。例如任何简单的(Message,End,YesOrNoAnswer)或&#34; multipleChoice&#34;节点,允许嵌套在我们想要的多个深度级别。

如何定义&#34; multipleChoice&#34; XSD中的节点(包括属性,文本,&#34;选择&#34;和&#34;效果&#34;节点)?提前谢谢!

1 个答案:

答案 0 :(得分:1)

这个答案怎么样 - 只适用于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提供正确数量的选择元素,使用assert来强制执行。 它还允许嵌套元素。

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