XSD:将xs:group与xs:all组合在一起?

时间:2014-01-21 10:30:19

标签: xml xsd

我正在努力使用xsd,我希望将xs:groupxs: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元素应始终允许RootContent1RootContent2以任意顺序(因此xs:all),并且每个元素还应该是可选的,但如果必要,仍然允许所有元素(在与xs:choice)对比

此外,我需要一组可重复使用的节点(由组TGroup定义),任意顺序的MixableX元素任意数量。它是xs:group因为组本身将被重用(在真正的xsd中),我想避免重复声明。

一些示例XML

<root>
    <Mixable1 />
</root>

<root>
    <Mixable2 />
    <RootContent1 />
</root>

<root>
    <Mixable2 />
    <Mixable1 />
    <Mixable2 />
    <RootContent2 />
</root>

我觉得我想要描述的是解析器的非确定性,因此无法用XSD表示,但我可能只是错过了一些东西。

1 个答案:

答案 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"/>