Нет подходящей глобальной декларации для корня проверки
Фон
Подтвердить документ XML с помощью схемы.
Проблема
Простейшая форма проблемы показана в двух файлах.
Документ XML
<?xml version="1.0"?>
<recipe
xmlns:r="http://www.namespace.org/recipe">
<r:description>
<r:title>sugar cookies</r:title>
</r:description>
</recipe>
Документ XSD
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:r="http://www.namespace.org/recipe">
<xsd:complexType name="recipe">
<xsd:choice>
<xsd:element name="description" type="descriptionType"
minOccurs="1" maxOccurs="1" />
</xsd:choice>
</xsd:complexType>
<xsd:complexType name="descriptionType">
<xsd:all>
<xsd:element name="title">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="5" />
<xsd:maxLength value="55" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:all>
</xsd:complexType>
</xsd:schema>
Error
Полное сообщение об ошибке из xmllint:
file.xml: 4: рецепт элемента: ошибка достоверности схемы: Element 'recipe': не существует соответствующего глобального объявления для корня проверки.
Вопрос
Каков правильный синтаксис (или какие атрибуты схемы отсутствуют), чтобы гарантировать, что данная схема может использоваться для успешной проверки данного XML-документа?
Ответы
Ответ 1
Вам нужно изменить свой экземпляр XML. Ваш текущий говорит, что в пространстве имен есть тип с названием description http://www.namespace.org/recipe. Однако в вашем определении XSD единственные типы, представленные в этом пространстве имен, называются recipe и descriptionType.
Поэтому либо определите тип с именем description в схеме XSD, либо измените свой экземпляр, чтобы правильно ссылаться на тип рецепта:
<?xml version="1.0" encoding="utf-8"?>
<r:recipe
xmlns:r="http://www.namespace.org/recipe">
<description>
<title>sugar cookies</title>
</description>
</r:recipe>
Ответ 2
В качестве корневых элементов могут использоваться только определения глобальных элементов. Ваша схема имеет только сложные типы и, следовательно, ошибку. Измените <xsd:complexType name="recipe">
на
<xsd:element name="recipe">
<xsd:complexType>
<xsd:choice>
<xsd:element name="description" type="descriptionType"
minOccurs="1" maxOccurs="1" />
</xsd:choice>
</xsd:complexType>
</xsd:element>
Подробнее об этом здесь
Ответ 3
В моей практике я получил No matching global declaration available for the validation root
в двух случаях: