Как я могу указать уникальное ограничение для атрибутов, используякак дочерний элементтег? - PullRequest
4 голосов
/ 10 января 2012

Если у меня есть следующая спецификация элемента в XSD, я могу добавить ограничение <xs:unique> как дочерний элемент <xs:element name="Parent">, но не могу заставить его работать как дочерний элемент <xs:element name="Child">:

<xs:element name="Parent">
  <xs:complexType>
    <xs:element name="Child" minOccurs="0" maxOccurs="unbounded">
      <xs:complexType>
        <xs:attribute name="Key" type="xs:string" use="required" />
      </xs:complexType>

      <!-- Option A: insert unique constraint here with selector . -->

    </xs:element>
  </xs:complexType>

  <!-- Option B: insert unique constraint here with selector ./Child -->

</xs:element>

Это уникальное ограничение, которое работает как потомок <xs:element name="Parent">:

<xs:unique name="ChildKey">
  <xs:selector xpath="./Child"/>
  <xs:field xpath="@Key" />
</xs:unique>

Но это уникальное ограничение не работает как потомок <xs:element name="Child">:

<xs:unique name="ChildKey">
  <xs:selector xpath="."/>
  <xs:field xpath="@Key" />
</xs:unique>

Нужно ли менять селектор XPath во втором случае?

1 Ответ

8 голосов
/ 10 января 2012

Если подумать, то селектор "."всегда будет возвращать текущий узел;селектор дает вам набор узлов только с одним узлом ... Таким образом, в наборе только с одним узлом уникальность гарантируется, поскольку атрибут с данным именем может встречаться только один раз.Это должно объяснить, почему вы не можете получить его так, как, по вашему мнению, должно работать.

Когда вы устанавливаете его на родительском уровне, это работает, потому что вы теперь применяете уникальность среди набора дочерних узлов.

В терминах базы данных ограничение, например, что вам нужно, может быть определено только на уровне таблицы.Вот как это будет выглядеть (я немного переписал 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:

enter image description here

Эквивалент ADO.NET E / R:

enter image description here

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...