ПРИМЕЧАНИЕ этот ответ неверен, как указал Серж.
Тестирование с xerces выдает эту ошибку: type.xsd:3:21: cos-element-consistent: Error for type '#AnonType_productinfo'. Multiple elements with name 'informationset', with different types, appear in the model group.
В спецификации есть больше деталей для согласованного с cos-элементом .
Но есть решение, похожее на ответ Марка ниже, но все еще использующее типы. Можно иметь несколько вхождений одного и того же с разными типами, если они находятся в списке супертипа minOccurs / maxOccurs, который расширен другими типами. То есть, как список полиморфных классов в Java или C #. Это устраняет проблему, указанную выше, поскольку, хотя это имя элемента может появляться в xml много раз, в xsd оно появляется только один раз.
Вот пример xsd и xml - проверено с xerces на этот раз!:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="productinfo">
<xs:complexType>
<xs:sequence>
<xs:element name="informationset" type="supertype" minOccurs="2" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="supertype">
</xs:complexType>
<xs:complexType name="Manufacturer">
<xs:complexContent>
<xs:extension base="supertype">
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Ingredients">
<xs:complexContent>
<xs:extension base="supertype">
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
<productinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<informationset xsi:type="Manufacturer"></informationset>
<informationset xsi:type="Ingredients"></informationset>
</productinfo>
ПРИМЕЧАНИЕ: Вы не можете контролировать порядок различных типов или сколько раз встречается каждый тип (каждый может появляться один раз, много раз или вообще не появляться) - так же, как с список полиморфных классов в Java или C #. Но вы можете, по крайней мере, указать точную длину списка в целом (если хотите).
Например, я ограничил приведенный выше пример ровно двумя элементами, но порядок не установлен (т. Е. Производитель может быть первым или Ingredients может быть первым); и число повторений не установлено (то есть они могут быть Производитель или оба Ингредиенты или по одному на каждый).
Вы можете с помощью XML Schema набрать , например:
<productinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<informationset xsi:type="Manufacturer"></informationset>
<informationset xsi:type="Ingredients"></informationset>
</productinfo>
И XSD определяет отдельные сложные типы для каждого из них:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="productinfo">
<xs:complexType>
<xs:sequence>
<xs:element name="informationset" type="Manufacturer"/>
<xs:element name="informationset" type="Ingredients"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Manufacturer">
</xs:complexType>
<xs:complexType name="Ingredients">
</xs:complexType>
</xs:schema>
Это особый случай для xsi:type
. В общем, не думайте, что вы можете указывать атрибуты с разными значениями в элементах с одинаковыми именами, поскольку они являются разными определениями одного и того же элемента.
Я не на 100% уверен в точной причине - кто-нибудь знает соответствующую часть спецификации?