我正在努力使用xsd,我希望将xs:group
和xs:all
条目组合在一起:
示例XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This group will be reused later -->
<xs:group name="TGroup">
<xs:choice>
<xs:element name="Mixable1" type="xs:string" />
<xs:element name="Mixable2" type="xs:string" />
<xs:element name="Mixable3" type="xs:string" />
</xs:choice>
</xs:group>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:group ref="TGroup" minOccurs="0" maxOccurs="unbounded" />
<xs:all>
<xs:element name="RootContent1" type="xs:string" minOccurs="0" />
<xs:element name="RootContent2" type="xs:string" minOccurs="0" />
</xs:all>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
(这不会在xs:all
)
xs:sequence
我想要实现的目标:
root
元素应始终允许RootContent1
和RootContent2
以任意顺序(因此xs:all
),并且每个元素还应该是可选的,但如果必要,仍然允许所有元素(在与xs:choice
)对比
此外,我需要一组可重复使用的节点(由组TGroup
定义),任意顺序的MixableX
元素任意数量。它是xs:group
因为组本身将被重用(在真正的xsd中),我想避免重复声明。
一些示例XML
<root>
<Mixable1 />
</root>
<root>
<Mixable2 />
<RootContent1 />
</root>
<root>
<Mixable2 />
<Mixable1 />
<Mixable2 />
<RootContent2 />
</root>
我觉得我想要描述的是解析器的非确定性,因此无法用XSD表示,但我可能只是错过了一些东西。
答案 0 :(得分:2)
如果你看看这个:http://www.w3schools.com/schema/el_sequence.asp 您将看到不允许嵌套xs:all in xs:sequence。
此外,我尝试通过创建一个包含标记的组来欺骗它,但是看起来,(并在此帖中引用:XML Schema: all, sequence & groups)
XML Schema规定所有组必须作为唯一的子组出现 在内容模型的顶部。
但是,如果您不打算使用RootContent1&amp; 2同时,然后Filburt是对的,你可以简单地选择另一个选择元素:
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:group ref="TGroup" minOccurs="0" maxOccurs="unbounded"/>
<xs:choice minOccurs="0">
<xs:element name="RootContent1" type="xs:string" minOccurs="0"/>
<xs:element name="RootContent2" type="xs:string" minOccurs="0"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
编辑:这可能是针对此特定情况的解决方法
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:group ref="TGroup" minOccurs="0" maxOccurs="unbounded"/>
<xs:choice>
<xs:sequence minOccurs="0">
<xs:element ref="RootContent1" minOccurs="0"/>
<xs:element ref="RootContent2" minOccurs="0"/>
</xs:sequence>
<xs:sequence minOccurs="0">
<xs:element ref="RootContent2" minOccurs="0"/>
<xs:element ref="RootContent1" minOccurs="0"/>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="RootContent2" type="xs:string"/>
<xs:element name="RootContent1" type="xs:string"/>