【发布时间】:2011-06-10 20:05:36
【问题描述】:
如何在 xsd 模式中定义备用 XML 结构?例如,下一个结构是可选的:
<a>
<b/>
<c>
<d/>
</c>
</a>
和
<a>
<c>
<e/>
</c>
</a>
在第一种情况下,如果在“c”元素下找到“d”元素,则必须有“b”元素。在第二种情况下,如果“c”下有“e”,则不允许有“b”元素。所以我正在寻找这种解决方案:
<xsd:element name="a">
<xsd:complexType>
<xsd:all>
(
<xsd:element name="b" type="whatever"/>
<xsd:element name="c">
<xsd:complexType>
<xsd:all>
<xsd:element name="d" type="whatever"/>
</xsd:all>
</xsd:complexType>
</xsd:element> )
) 或 (
<xsd:element name="c">
<xsd:complexType>
<xsd:all>
<xsd:element name="e" type="whatever"/>
</xsd:all>
</xsd:complexType>
</xsd:element>
)
</xsd:all>
</xsd:complexType>
</xsd:element>
我不想使用选择元素的原因是因为我正在为 XML 文档制作一个编辑器界面,而在我的例子中,选择在编辑器界面中看起来很愚蠢。
【问题讨论】:
-
但
<xs:choice>是for“选择”。这就是它的目的。 -
嗯。你现在就是我想的。我必须以不同的方式做这件事。
-
但是您如何对整个结构进行选择呢?我的意思是会有不止一个元素作为选项。第一个选择包括 b 和 c,第二个选择只包括 c。我的意思是我不想将 b 和 c 包含在第三个元素中。
-
看起来我可以使用组元素:w3schools.com/schema/el_group.asp
-
好的,实际上我必须在组元素内有一个序列元素,或者只有没有组的序列。因此,选择元素将仅包含序列元素,其中第一个元素将包含 b 和 c(将包含 d),第二个将包含 c(将包含 e)。呸。顺便说一句:选择元素不能包含 all 元素(这将允许我的 b 和 c 以任何顺序排列)有什么合理的理由吗?