xsd уникальное ограничение не работает

У меня есть корневой тег Inserts, последовательность тегов Inserts, каждый с атрибутом "name".

Я не могу получить онлайн-валидатор, чтобы узнать, что есть повторяющиеся значения "имя".

Мы боролись в течение... дней. Спасибо, что узнали.

XSD:

   <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.osames.org/osamesorm"
  targetNamespace="http://www.osames.org/osamesorm" elementFormDefault="qualified">

  <xs:element name="Inserts">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Insert" maxOccurs="unbounded">
              <xs:complexType>
               <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="name" type="xs:string" use="required"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
        <xs:unique name="unique-isbn">
          <xs:selector xpath="Inserts/Insert"/>
          <xs:field xpath="@name"/>
        </xs:unique>
      </xs:element>

</xs:schema>

XML:

<?xml version="1.0" encoding="UTF-8"?>
<Inserts xmlns="http://www.osames.org/osamesorm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osames.org/osamesorm ./xml_schemas/verysimple.xsd">
<Insert name="BaseInsert">INSERT INTO {0} ({1}) values ({2});</Insert>
<Insert name="BaseInsert">INSERT INTO {0} ({1}) values ({2});</Insert>
</Inserts>

1 ответ

Решение

В вашей схеме есть две проблемы:

Во-первых, ваш XPath селектора неверен в зависимости от того, где вы его определили. <xs:unique> элемент находится внутри <Inserts> элемент, но ваш XPath читает Inserts/InsertЭто означает, что внутри этого <Inserts> элемент, другой <Inserts> элемент ожидается, и только в нем <Insert> элемент.

<xs:unique> ограничение, однако, уже в пределах <Inserts> элемент, поэтому вам просто нужно найти <Insert> элемент:

<xs:unique name="unique-isbn">
  <xs:selector xpath="Insert"/>
  <xs:field xpath="@name"/>
</xs:unique>

Вторая проблема заключается в том, что XPath не имеет представления о пространстве имен по умолчанию, определенном в Xml с xmlns приписывать. Insert элемент, на который вы ссылаетесь в вашем XPath, не является Insert элемент из пространства имен вашего XSD по умолчанию, но Insert элемент без URI пространства имен.

Чтобы справиться с этим, добавьте префикс пространства имен для вашего пространства имен (в качестве альтернативы пространству имен по умолчанию) в файл XSD:

  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.osames.org/osamesorm" targetNamespace="http://www.osames.org/osamesorm" xmlns:o="http://www.osames.org/osamesorm" elementFormDefault="qualified">

Затем используйте этот префикс пространства имен в вашем XPath:

<xs:unique name="unique-isbn">
  <xs:selector xpath="o:Insert"/>
  <xs:field xpath="@name"/>
</xs:unique>

С этими изменениями этот валидатор выводит

Существует повторяющаяся последовательность ключей "BaseInsert" для ключа " http://www.osames.org/osamesorm:unique-isbn" или ограничения уникальной идентификации. Строка: 1 Колонка:357

Другие вопросы по тегам