在xs:all条目和xs:all条目组合的情况下,我很难找到一个xsd:
样本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来表示,但我还是漏掉了一些东西。
发布于 2014-01-21 11:32:24
如果您查看这个:sequence.asp,您将发现您不允许嵌套xs:all在xs:sequence中。
此外,我还试图通过创建一个包含标记的组来欺骗它,但是当它出现时(并且在本文中也引用了:XML Schema: all, sequence & groups)
XML规定,所有组必须显示为内容模型顶部的唯一子组。
但是,如果您不打算同时拥有RootContent1 &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"/>https://stackoverflow.com/questions/21255486
复制相似问题