Assuming no common structure, we could define them to all be abstract elements:
<xs:element name="b:species" type="xs:anyType" abstract="true"/> <xs:element name="b:location" type="xs:anyType" abstract="true"/> <xs:element name="b:areatype" type="xs:anyType" abstract="true"/> <xs:element name="b:counts" type="xs:anyType" abstract="true"/> <xs:element name="b:observations" type="xs:anyType" abstract="true"/>
Then we define specific kinds of species/locations/etc. and put them in the substitution group:
<xs:element name="b:latin-name" substitutionGroup="b:species"> <xs:complexType> <xs:attribute name="genus" type="xs:string" use="required"/> <xs:attribute name="species" type="xs:string" use="optional"/> </xs:complexType> </xs:element> <xs:element name="b:gis-location" substitutionGroup="b:location"> <xs:complexType> </xs:complexType> </xs:element>