Если подумать, то селектор "."всегда будет возвращать текущий узел;селектор дает вам набор узлов только с одним узлом ... Таким образом, в наборе только с одним узлом уникальность гарантируется, поскольку атрибут с данным именем может встречаться только один раз.Это должно объяснить, почему вы не можете получить его так, как, по вашему мнению, должно работать.
Когда вы устанавливаете его на родительском уровне, это работает, потому что вы теперь применяете уникальность среди набора дочерних узлов.
В терминах базы данных ограничение, например, что вам нужно, может быть определено только на уровне таблицы.Вот как это будет выглядеть (я немного переписал XSD, чтобы получить хороший E / R из него).
XSD:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:tns="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Parent" type="Parent">
<xs:unique name="ParentKey">
<xs:selector xpath="tns:Child"/>
<xs:field xpath="@Key"/>
</xs:unique>
</xs:element>
<xs:complexType name="Parent">
<xs:sequence>
<xs:element name="Child" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="Key" type="xs:string" use="required"/>
</xs:complexType>
<xs:unique name="ChildKey">
<xs:selector xpath="."/>
<xs:field xpath="@Key"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
Диаграмма XSD:
Эквивалент ADO.NET E / R:
XML с ошибками:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<Parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">
<Child Key="Key1"/>
<Child Key="Key1"/>
</Parent>
Сообщение об ошибке:
Error occurred while loading [], line 5 position 3
There is a duplicate key sequence 'Key1' for the 'http://tempuri.org/XMLSchema.xsd:ParentKey' key or unique identity constraint.
Unique.xml is invalid.