Я проверил свою гипотезу в комментарии, и она работает с использованием версии xerces в JDK 6. Я немного упростил схему, но общая структура та же:
Схема
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="doc" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="relationship" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="ps" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="pd" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="u1">
<xs:selector xpath="doc"/>
<xs:field xpath="@pd"/>
<xs:field xpath="relationship/@ps" />
</xs:unique>
</xs:element>
</xs:schema>
Экземпляр документа
<root>
<doc pd="fred">
<relationship ps="125" />
</doc>
<doc pd="geoff">
<relationship ps="119" />
<relationship ps="118" />
<relationship ps="117" />
<relationship ps="118" />
</doc>
<doc pd="fred">
<relationship ps="125" />
</doc>
<doc pd="james">
<relationship ps="125" />
</doc>
</root>
При проверке xerces выдает сообщение об ошибке:
[Ошибка]: 13: 28: Дубликат уникального значения [fred, 125] объявлен для ограничения идентичности элемента «корень».
Если вы измените отношение второго Джеймса ps на 126, документ будет подтвержден без ошибок.