У меня есть несколько схем XSD, которые импортированы другой. При проверке на основе основного XSD, подобного оболочке, валидатор, похоже, не связывает тип с правильным XSD. Кажется, что это путает пространство имен по-своему.
В качестве минимального примера рассмотрим следующие два XSD, каждый из которых определяет свой собственный тип и пространство имен:
a.xsd определение a-type
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://a"
targetNamespace="http://a"
elementFormDefault="qualified"
attributeFormDefault="qualified">
<xs:simpleType name="a-type">
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:schema>
b.xsd определение b-type
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://b"
targetNamespace="http://b"
elementFormDefault="qualified"
attributeFormDefault="qualified" >
<xs:simpleType name="b-type">
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:schema>
ab.xsd который определяет его ab-type
, используя определенные выше типы:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:a="http://a"
xmlns:b="http://b"
xmlns:tns="http://ab"
targetNamespace="http://ab"
elementFormDefault="qualified"
attributeFormDefault="qualified" >
<xs:import namespace="http://a" schemaLocation="a.xsd"/>
<xs:import namespace="http://b" schemaLocation="b.xsd"/>
<xs:complexType name="ab-type">
<xs:sequence maxOccurs="1">
<xs:element name="a-tag" type="a:a-type"/>
<xs:element name="b-tag" type="b:b-type"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ab-tag" type="tns:ab-type"/>
</xs:schema>
Когда я проверяю его по следующему XML-файлу:
<?xml version="1.0" encoding="UTF-8"?>
<ab:ab-tag
xmlns:ab="http://ab"
xmlns:a="http://a"
xmlns:b="http://b">
<a:a-tag>A</a:a-tag>
<b:b-tag>B</b:b-tag>
</ab:ab-tag>
Я получаю следующую ошибку отxmllint --schema ab.xsd ab.xml
:
ab.xml: 6: элемент a-tag
: Ошибка достоверности схемы: Элемент {http://a}a-tag
: Этот элемент не ожидается. Ожидается ({http://ab}a-tag
). ab.xml не может проверить
У меня также есть похожая ошибка при проверке с xsd11-validator.jar
. Таким образом, хотя в ab.xsd
я указываю, что a-tag
имеет тип a:a-tag
, он все еще пытается связать его с пространством имен из ab
.