不同的儿童元素集合

时间:2011-01-17 10:07:57

标签: schema xsd

是否可以创建一个模式,其中元素的子元素将序列中的部分元素而不是部分元素?像这样的东西:

<xs:element name="rootElement">
 <xs:complexType>
  <xs:all>
   <xs:element name="value1" type="xs:string"/>
   <xs:element name="value2" type="xs:string"/>
  </xs:all>
  <xs:sequence>
   <xs:element name="value3" type="xs:string"/>
   <xs:element name="value4" type="xs:string"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

提前致谢!

1 个答案:

答案 0 :(得分:0)

行。我想我知道你知道。您的XML看起来像:

<?xml version="1.0"?>
<house> 
    <ownerName>aaa</ownerName>
    <ownerLastName>bbb</ownerLastName>
    <rooms>
        <room1>kitchen</room1>
        <room2>living room</room2>
        <room3></room3>
        <room4></room4> 
        <room5></room5>
    </rooms>
</house>

您希望ownerNameownerLastName元素以任何顺序出现,尽管它们必须同时存在。从您的描述中不清楚rooms元素的位置是否重要。我以为是。重要的是rooms的子元素保持有序。

拆分,我们可以为房间定义complexType(所以模型已经完成)

<xs:complexType name="RoomType">
    <xs:simpleContent>
        <xs:extension base="xs:string"/>
    </xs:simpleContent>
</xs:complexType>

<xs:element name="RoomsType">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="room1" type="RoomType"/>
            <xs:element name="room2" type="RoomType"/>
            <xs:element name="room3" type="RoomType"/>
            <xs:element name="room4" type="RoomType"/>
            <xs:element name="room5" type="RoomType"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

这为我们提供了顺序的房间序列。

使用xs:all有很多限制,所以我在这里避免使用它(例如,你不能在序列中使用)。为了允许所有者名称以任何顺序出现,我使用了两个序列的选择。选择嵌入在另一个序列中,以确保rooms元素最后一个。

<xs:complexType name="HouseType">
    <xs:sequence>
        <xs:choice>
            <xs:sequence>
                <xs:element ref="ownerName"/>
                <xs:element ref="ownerLastName"/>
            </xs:sequence>
            <xs:sequence>
                <xs:element ref="ownerLastName"/>
                <xs:element ref="ownerName"/>
            </xs:sequence>
        </xs:choice>
        <xs:element name="rooms" type="HouseType"/>
    </xs:sequence>
</xs:complexType>

<xs:element name="house" type="HouseType"/>

现在,如果您实际上不关心订单或ownerLastNameownerName house,那么您可以使用xs:all一个问题:

<xs:complexType name="HouseType">
    <xs:all>
        <xs:element ref="ownerName"/>
        <xs:element ref="ownerLastName"/>
        <xs:element name="rooms" type="HouseType"/>
    </xs:all>
</xs:complexType>

要求您以任何顺序存在所有三个元素。