импорт xsd из xsd включает - PullRequest
0 голосов
/ 23 июня 2019

У меня следующий "imp.xsd":

<xsd:schema targetNamespace="http://imported"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="Imported" type="xsd:string"/>
</xsd:schema>

импортировано из "incl.xsd":

<xsd:schema targetNamespace="http://main"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:import namespace="http://imported" schemaLocation="file:///C:/.../imp.xsd"/>
    <xsd:element name="Included" type="xsd:string"/>
</xsd:schema>

, что в свою очередь включено из "main.xsd":

<xsd:schema targetNamespace="http://main"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="file:///C:/.../incl.xsd"/>
    <xsd:complexType name="dummy">
        <xsd:sequence xmlns:impt="http://imported" xmlns:incl="http://main">
            <xsd:element ref="incl:Included"/>
            <xsd:element ref="impt:Imported"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

Вопрос: является ли "main.xsd" действительным документом схемы XML?

При проверке с помощью синтаксического анализатора xmllint (или из библиотеки python lxml, которая, в свою очередь, использует xmllint), я получаю следующую ошибку:

Элемент '{http://www.w3.org/2001/XMLSchema}element', attribute'ref ': ссылки из этой схемы на компоненты в пространстве имен' http://imported' недопустимы, поскольку не указываются в операторе импорта.Схема WXS main.xsd не смогла скомпилировать

Однако другой анализатор (IBM) принимает этот XSD без каких-либо жалоб.

Насколько я понимаю, xsd: include, он должен вести себя какесли весь включенный XSD включен в основной документ.Так что, на мой взгляд, «main.xsd» должен быть действительным.Это так?

Редактировать: Я немного экспериментировал с xmllint, и когда я добавил строку

<xsd:import namespace="http://imported" schemaLocation="file:///C:/.../imp.xsd"/>

в "main.xsd", xmllintпринимает эту схему.Однако, когда я добавляю эту же строку, пропуская file:///, я получаю следующее предупреждение:

Элемент '{http://www.w3.org/2001/XMLSchema}import': Пропуск импорта схемы, расположенной в' C: / .../imported.xsd 'для пространства имен' http://imported',, поскольку это пространство имен уже импортировано со схемой, расположенной в 'file: /// V: /.../imported.xsd'.

Отсюда я делаю вывод, что оригинальный файл "main.xsd" действителен и что это ошибка в xmllint.

...