我有一个XML,它的一部分看起来像这样:
TextData>
TextGroup ID = " Group1 ">
TextGroup ID = " Group2 ">
TextGroup ID = GroupN ">
文本ID=SomeID>Some Text
所以,在TextData中,可以有1..N个级别的元素,最低级别的TextGroup必须包含至少一个元素。
我如何在XSD中描述这一点?这可能吗?到目前为止,我有这个,但是,当然,它只允许我使用2个级别,并且还强制使用2个级别,所以不适合我:
<xs:element name="TextData">
<xs:complexType>
<xs:all>
<xs:element name="TextGroup">
<xs:complexType>
<xs:all>
<xs:element name="TextGroup">
<xs:complexType>
<xs:all>
<xs:element name="Text"type="xs:string">
</xs:element>
在某些时候,您需要使用对已经用名称定义的元素之一的引用,例如通过使用命名的复杂类型。
在每个元素中,用<xs:choice>
代替<xs:all>
。通过这样做,您可以确保另一层或字符串元素是任何级别的子元素。
这可能类似于以下内容(未经过测试,因为我在问题中没有看到完整的XSD,但是您可以理解):
<xs:element name="TextData" type="myTextDataType"/>
<xs:complexType name="myTextDataType">
<xs:choice>
<xs:element name="TextGroup" type="myTextDataType"/>
<xs:element name="Text" type="xs:string"/>
</xs:choice>
</xs:complexType>
或者,用不同的话解释:
这与在形式语法中构建某物链的"技巧"相同。在链中,您可以选择一个通过添加另一个非终结符来延长链的规则,"从链可以进一步延长的地方循环回到当前状态"(例如A -> aA
),以及一个以不规则的内容结束链的规则(例如A -> b
)。