我有一个XML,其部分看起来像这样:
的TextData>
TextGroup ID =" Group1">
TextGroup ID =" Group2">
TextGroup ID = GroupN">
文字ID = SomeID>某些文字
因此,在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>
答案 0 :(得分:1)
在某些时候,您需要使用对已使用名称定义的元素之一的引用,例如使用命名的复杂类型。
在每个元素中,使用<xs:all>
而不是<xs:choice>
。通过这样做,您可以确保 另一个级别或字符串元素是任何级别的子元素。
这可能类似于以下内容(未经测试,因为我在问题中看不到您的完整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>
或者,用不同的词语解释:
它是相同的&#34;技巧&#34;就像在正式语法中建立一系列东西一样。在链中,您可以选择通过添加另一个非终端来延长链的规则,然后循环回到链可以进一步延长的当前状态&#34; (例如,A -> aA
),以及以不规则的方式结束链的规则(例如,A -> b
)。