No matching global declaration available for the validation root

In my practice, I got the No matching global declaration available for the validation root in two cases:

  • If XSD does not contain an <xsd:element name="recipe" .../> explained in @aravind-r-yarram's answer.

  • If <recipe/> in XML does not contain an xmlns attribute. In such case adding the xmlns will help:

      <recipe xmlns="http://www.namespace.org/recipe">
          ...
      </recipe>
    

You need to change your XML instance. Your current one says that there is a type called description in the namespace http://www.namespace.org/recipe. However, in your XSD definition, the only types exposed in that namespace are called recipe and descriptionType.

So either define a type called description in the XSD schema, or change your instance so you are referencing the recipe type correctly:

<?xml version="1.0" encoding="utf-8"?>
<r:recipe
  xmlns:r="http://www.namespace.org/recipe">
  <description>
    <title>sugar cookies</title>
  </description>
</r:recipe>

UPDATE This is only half the solution - the other half is in @Aravind's answer here: https://stackoverflow.com/a/8426185/569662


Only global element definitions can be used as root elements. Your schema only has complex types and hence the error. Change the <xsd:complexType name="recipe"> to

<xsd:element name="recipe">
  <xsd:complexType>
    <xsd:choice>
      <xsd:element name="description" type="descriptionType"
        minOccurs="1" maxOccurs="1" />
    </xsd:choice>
  </xsd:complexType>
</xsd:element>

Read more about this here

Tags:

Xml

Xsd

Xmllint