Надеюсь, я вас хорошо понял, ваша проблема в том, что
<employee>
<firstname></firstname>
<lastname>Smith</lastname>
</employee>
действует в соответствии с XSD.
Прежде всего вы должны понимать, что во многих языках пустая строка и нулевое значение не одинаковы, например в Java:
String s1 = ""; // empty string, length is 0
String s2 = null; // null value, has no length...
Это не так для Oracle PL / SQL, где нулевая и пустая строки совпадают.
Так что я думаю, что этот действительный XML (в соответствии с вашим XSD) вам тоже не подходит:
<employee>
<firstname xsi:nil="true" />
<lastname xsi:nil="true" />
</employee>
Если у вас есть дополнительные условия, которым должны соответствовать имя / фамилия, вы должны создать собственный тип:
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<!-- changed -->
<xs:element name="firstname" type="e:firstnameType" />
<!-- not changed -->
<xs:element name="lastname" type="xs:string" minOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="firstnameType">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse" />
<xs:minLength value="1" />
</xs:restriction>
</xs:simpleType>
Хорошее описание коллапс здесь здесь . Другие ограничения для строки вы можете найти здесь .
Для других я добавляю свои полные файлы XSD и XML:
XSD
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:e="employee"
targetNamespace="employee"
elementFormDefault="qualified">
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="e:firstnameType" />
<xs:element name="lastname" type="xs:string" minOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="firstnameType">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse" />
<xs:minLength value="1" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
XML
<?xml version="1.0" encoding="UTF-8"?>
<employee xmlns="employee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<firstname>Martin</firstname>
<lastname xsi:nil="true"></lastname>
</employee>