在 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>
所以,第一个问题是:
- "choice" 节点的数量必须与 "numberOfChoices" 属性中定义的节点数量相同
- "choice" 节点必须跟在 "effect" 节点之后,它只包含一些属性
- 在 "effect" 节点之后可以插入任何其他类型的节点,没有任何顺序并且可以插入任意次数。例如任何简单的节点(Message、End、YesOrNoAnswer)或 "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 个或更多其他元素。
我面临以下问题。我需要为我的 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>
所以,第一个问题是:
- "choice" 节点的数量必须与 "numberOfChoices" 属性中定义的节点数量相同
- "choice" 节点必须跟在 "effect" 节点之后,它只包含一些属性
- 在 "effect" 节点之后可以插入任何其他类型的节点,没有任何顺序并且可以插入任意次数。例如任何简单的节点(Message、End、YesOrNoAnswer)或 "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 个或更多其他元素。