No hay una declaración global coincidente disponible para la raíz de validación


Antecedentes

Valide un documento XML utilizando un esquema.

Problema

La forma más simple del problema se muestra en dos archivos.

Documento XML

<?xml version="1.0"?>

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

<r:description>
  <r:title>sugar cookies</r:title>
</r:description>

</recipe>

Documento 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

El mensaje de error completo de xmllint:

Archivo.xml: 4: element recipe: Schemas error de validez: Element 'recipe' : No hay una declaración global coincidente disponible para la validación arraigar.

Pregunta

¿Cuál es la sintaxis correcta (o qué atributos de esquema faltan) para garantizar que el esquema dado se pueda usar para validar correctamente el documento XML dado?

Author: Dave Jarvis, 2011-12-08

3 answers

Necesita cambiar su instancia XML. Su actual dice que está buscando un tipo llamado description en el espacio de nombres http://www.namespace.org/recipe. Sin embargo, los únicos tipos expuestos en ese espacio de nombres se llaman recipe y descriptionType.

Así que defina un tipo llamado descripción en el esquema XSD, o cambie su instancia para hacer referencia a la receta escriba correctamente:

<?xml version="1.0" encoding="utf-8"?>
<r:recipe
  xmlns:r="http://www.namespace.org/recipe">
  <description>
    <title>sugar cookies</title>
  </description>
</r:recipe>
 24
Author: tom redfern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-10 10:26:32

Solo se pueden usar definiciones globales de elementos como elementos raíz. Su esquema solo tiene tipos complejos y por lo tanto el error. Cambiar <xsd:complexType name="recipe"> a

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

Lea más sobre esto aquí

 14
Author: Aravind R. Yarram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-07 16:23:10

En mi práctica, obtuve el No matching global declaration available for the validation root en dos casos:

  • Si XSD no contiene un <xsd:element name="recipe" .../> explicado en la respuesta de @aravind-r-yarram.
  • Si <recipe/> en XML no contiene un atributo xmlns. En tal caso añadir el xmlns ayudará:

    <recipe xmlns="http://www.namespace.org/recipe">
        ...
    </recipe>
    
 2
Author: Artur Klesun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-05 16:28:55