Я думаю, что вы дали только фрагмент вашего xsd? Отладка проще, если вы можете предоставить рабочий фрагмент. Я добавил окружение <element name="root">
, чтобы оно подтвердилось.
Кажется, проблема в том, что селектор enumValueKey
группирует все enumValues
по всем enumType
; но вы хотите сгруппировать их только в пределах одного enumType
.
Единственный способ исправить это - переместить <key>
для enumValues
в элемент enumType
(и отрегулировать селектор xpath
), так что все становится так:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="enumTypes">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="enumType">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="enumValue">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:string"/>
</xs:complexType>
<xs:key name="enumValueKey">
<xs:selector xpath="enumValue"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="enumTypeKey">
<xs:selector xpath="enumTypes/enumType"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
</xs:schema>
Это работает, поскольку позволяет использовать ваш XML-пример и запрещает следующий фрагмент (с двумя 1
), как следует:
...
<enumType id="2">
<enumValue id="1" value="Item1"/>
<enumValue id="1" value="Item2"/>
</enumType>
...
Дайте мне знать, если это работает для вас. Мне также интересно, есть ли другой способ выразить это.