Включение / импорт локальных схем, которые имеют пространства имен - PullRequest
5 голосов
/ 18 марта 2012

Вот файл схемы, midi.xsd, который определяет тип, note, используемый для хранения значений нот MIDI:

<?xml version="1.0" encoding="utf-8"?>

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

  <xs:simpleType name="note">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="127"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>

Вот еще один файл схемы, octaves.xsd, который использует midi.xsd чтобы помочь определить макет, который будет применен к XML-файлу, содержащему данные об октавах:

<?xml version="1.0" encoding="utf-8"?>

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

  <xs:include schemaLocation="midi.xsd"/>

  <xs:element name="octaves">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="octave">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string" />

              <xs:element name="midi">
                <xs:complexType>
                  <xs:sequence>

                    <xs:element name="value" type="xs:integer" />
                    <xs:element name="from" type="note" />
                    <xs:element name="to" type="note" />

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

            </xs:sequence>

            <xs:attribute name="index" type="xs:integer" />

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

</xs:schema>

Это нормально и работает точно так, как вы ожидаете, за исключением того, что у меня есть другое требование: я хочуnote находиться в своем собственном пространстве имен, midi, так что

<xs:element name="from" type="note" />

становится

<xs:element name="from" type="midi:note" />

Как ни старайся, я не могу заставить это работать.Мои попытки включали использование атрибута targetNamespace в разных местах, элемента import и либеральное использование xmlns:midi="...", но безрезультатно.Я бы опубликовал одну из этих попыток здесь, если бы она не была настолько ужасной.

Может ли какая-то добрая душа направить меня в правильном направлении? Я почти уверен, что проблема в том, что midi.xsd является локальным файлом ;он никогда не был и никогда не будет размещен на веб-сервере.

1 Ответ

5 голосов
/ 18 марта 2012

Измените midi.xsd на:

<xs:schema elementFormDefault="qualified"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       targetnamespace="/my/midi/namespace">

А затем измените octaves.xsd на:

<xs:schema elementFormDefault="qualified"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:midi="/my/midi/namespace">

   <xs:import namespace="/my/midi/namespace" schemaLocation="midi.xsd"/>

   ...

   <xs:element name="from" type="midi:note" />

Обратите внимание на использование xs:import вместо <xs:include>.два очень разные - вы используете import для ввода других пространств имен и include для встроенного включения других файлов схемы в текущее пространство имен.

Также обратите внимание, что /my/midi/namespaceможет быть любым, что угодно, это произвольный идентификатор.

Я уверен, что проблема заключается в том, что midi.xsd является локальным файлом

Нет, не актуально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...