У меня следующий "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
.