让我用下面的例子来帮助解释一下。
有效的XML文档可以包含:
我不确定自己哪里出错了,我觉得它与xs有关:所有在群组标签中。不过我是制作和使用XSD的新手,所以非常感谢任何帮助。
<xs:element name="main">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:group ref="group1" />
<xs:group ref="group2" />
</xs:choice>
</xs:complexType>
</xs:element>
<xs:group name="group1">
<xs:all>
<xs:element ref="a" />
<xs:element ref="b" />
<xs:element ref="c" />
<xs:element ref="d" />
<xs:element ref="e" />
<xs:element ref="f" />
</xs:all>
</xs:group>
<xs:group name="group2">
<xs:all>
<xs:element ref="g" />
<xs:element ref="h" />
<xs:element ref="i" />
<xs:element ref="j" />
</xs:all>
</xs:group>
答案 0 :(得分:0)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/XMLSchema.xsd"
xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="a" type="xs:string" />
<xs:element name="b" type="xs:string" />
<xs:element name="c" type="xs:string" />
<xs:element name="d" type="xs:string" />
<xs:element name="e" type="xs:string" />
<xs:element name="f" type="xs:string" />
<xs:element name="g" type="xs:string" />
<xs:element name="h" type="xs:string" />
<xs:element name="i" type="xs:string" />
<xs:element name="j" type="xs:string" />
<xs:group name="group1">
<xs:sequence>
<xs:element ref="a" />
<xs:element ref="b" />
<xs:element ref="c" />
<xs:element ref="d" />
<xs:element ref="e" />
<xs:element ref="f" />
</xs:sequence>
</xs:group>
<xs:group name="group2">
<xs:sequence>
<xs:element ref="g" />
<xs:element ref="h" />
<xs:element ref="i" />
<xs:element ref="j" />
</xs:sequence>
</xs:group>
<xs:complexType name="main">
<xs:choice maxOccurs="2">
<xs:group ref="group1" />
<xs:group ref="group2" />
</xs:choice>
</xs:complexType>
</xs:schema>
•您在整个示例中使用了“ref”。这意味着您正在引用全局(定义为'schema'的直接子代)。我将此添加到我的示例中,因此没有对我所指的内容做出任何假设。
•您还提到了群组。如果元素集合一起出现在XML文档的多个位置,则可以将这些元素组合在一起,以便更容易一次引用它们。换句话说,就像你可以创建我在上面提到的全局定义的元素并在整个XML Schema中引用它们一样,你可以命名一个模型组(序列,无序列表或选择,但不是'all'),以及在整个XML Schema中引用该组。再次,我将这些全局定义的(模式的子组)组添加到我的示例中,因此对于我所指的“ref”没有混淆。
•默认的minOccurs和maxOccurs属性值均为1.除了这些默认值(分配给“choice”元素),选项集中只有一个元素可以出现在有效的XML文档中。如果maxOccurs属性的值大于1,则该值确定可能出现的选项数量。你说两种选择都可以出现,所以我把它设置为2.
•使用<xs:all>
的一种方法,即允许分组元素处于任何顺序是不使用全局组,只需在每次出现时将它们简单地键入XML模式。我在下面的第二个答案显示了如何克服这一点。
如果我对你感到困惑,请告诉我。 哎呀...不得不解决一个小错字。一切都好了。对不起,我试图快速解决这个问题并搞砸了。杰森
答案 1 :(得分:0)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/XMLSchema.xsd"
xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="main">
<xs:all>
<xs:element minOccurs="0" name="group1">
<xs:complexType>
<xs:all>
<xs:element name="a" type="xs:string" />
<xs:element name="b" type="xs:string" />
<xs:element name="c" type="xs:string" />
<xs:element name="d" type="xs:string" />
<xs:element name="e" type="xs:string" />
<xs:element name="f" type="xs:string" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="group2">
<xs:complexType>
<xs:all>
<xs:element name="g" type="xs:string" />
<xs:element name="h" type="xs:string" />
<xs:element name="i" type="xs:string" />
<xs:element name="j" type="xs:string" />
</xs:all>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:schema>