XML-схемы имеют эти абстрактные типы, которые упрощают эту задачу до тех пор, пока префикс xsi в атрибуте type в вашем фактическом XML не беспокоит вас. Вы можете определить, что у вас есть выше, следующим образом:
<!--items element-->
<xs:element name="items">
<xs:complexType>
<xs:sequence>
<xs:element ref="item" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<!--individual item element-->
<xs:element name="item" type="item" />
<!--make the item type abstract so you're forced to declare its type in the XML file-->
<xs:complexType name="item" abstract="true" />
<!--declare your simple type - mixed content is so that you can have text in a complex type-->
<xs:complexType name="simple">
<xs:complexContent mixed="true">
<xs:extension base="item">
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!--declare your complex type-->
<xs:complexType name="complex">
<xs:complexContent>
<xs:extension base="item">
<!--define the stuff that can go into that complex element-->
<xs:sequence>
<xs:element name="b" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
И ваш полученный XML будет выглядеть следующим образом:
<items xmlns="your-namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<item xsi:type="simple">some text</item>
<item xsi:type="complex">
<b>other text</b>
</item>
</items>