Another option is for you to use inheritance. Your resulting XML isn't as pretty, but you get exactly the content you want:
<xsd:element name="field" type="field" abstract="true" /> <xsd:element name="subfield" type="xsd:string" /> <xsd:complexType name="field" abstract="true" /> <xsd:complexType name="subfield"> <xsd:complexContent> <xsd:extension base="field"> <xsd:sequence> <xsd:element ref="subfield" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" /> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="no-subfield"> <xsd:complexContent mixed="true"> <xsd:extension base="field"> <xsd:attribute name="name" type="xsd:string" /> </xsd:extension> </xsd:complexContent> </xsd:complexType>
Then your resulting XML would contain the following (assuming you have xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" declared somewhere)
<field xsi:type="subfield"> <subfield>your stuff here</subfield> </field>
or
<field xsi:type="no-subfield">your other stuff</field>
Most importantly, it disallows
<field xsi:type="subfield"> Text you don't want <subfield>your stuff here</subfield> More text you don't want </field>