Отсутствие targetNamespace вызывает исключения из схемы - PullRequest
1 голос
/ 06 июня 2019

Я пытаюсь понять, почему отсутствие targetNamespace вызывает следующие ошибки в моей примерной XML-схеме. Если я удаляю targetNamespace ( targetNamespace = "http://tempuri.org/XMLSchema1.xsd"),, я получаю следующие ошибки:

Пространство имен 'http://tempuri.org/XMLSchema1.xsd' не доступны для ссылки в этом схемы. XMLSchema1.xsd 30

Идентификатор 'http://tempuri.org/XMLSchema1.xsd:ChildNamePK' ограничение не объявлено. XMLSchema1.xsd 30

Если я снова добавлю targetNamespace, эти ошибки исчезнут, но на самом деле это пример аннотированной схемы sql, которую я сократил для целей этого поста. Поскольку все элементы являются локальными, я хотел удалить targetNamespace из моей реальной схемы. Как бы я исправить схему, не добавляя targetNamespace?

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchema1"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Parent">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Child" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Name" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="OldestChild">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Name" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:key name="ChildNamePK">
      <xs:selector xpath=".//Child" />
      <xs:field xpath="Name" />
    </xs:key>
    <xs:keyref name="OldestChildFK" refer="ChildNamePK">
      <xs:selector xpath=".//OldestChild" />
      <xs:field xpath="Name" />
    </xs:keyref>
  </xs:element>
</xs:schema>

1 Ответ

0 голосов
/ 11 июня 2019

Проблема здесь в строке:

xmlns="http://tempuri.org/XMLSchema1.xsd"

Эта строка говорит, что любые QNames, которые не имеют префикса пространства имен, должны обрабатываться так, как если бы пространство имен было http://tempuri.org/XMLSchema1.xsd. Это называется пространством имен по умолчанию.

Атрибут refer в элементе xs:keyref является одним из этих QNames, и для него установлено значение ChildNamePK, которое не имеет префикса пространства имен. Поскольку префикса пространства имен нет, и поскольку вы определили пространство имен по умолчанию, схема XML эффективно обрабатывает это, как если бы оно было

refer="{http://tempuri.org/XMLSchema1.xsd}ChildNamePK"

т.е. как если бы он ссылался на элемент ChildNamePK в пространстве имен http://tempuri.org/XMLSchema1.xsd.

Однако, удаляя targetNamespace, вы говорите, что ваши элементы, включая ключ ChildNamePK, не находятся в пространстве имен. То, что атрибуты refer не существуют на самом деле. Вот что пытается сказать вторая ошибка - она ​​ищет http://tempuri.org/XMLSchema1.xsd:ChildNamePK', но ее не существует.

Правильное решение здесь, вероятно, состоит в том, чтобы просто удалить строку xmlns="...", чтобы не было пространства имен по умолчанию. Таким образом, атрибут reference будет ссылаться на QName, который не находится в пространстве имен, что в точности соответствует ChildNamePK при удалении строки targetNamespace.

...