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?
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>
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í
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 atributoxmlns
. En tal caso añadir elxmlns
ayudará:<recipe xmlns="http://www.namespace.org/recipe"> ... </recipe>
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