validar - xmllint xpath
No hay declaración global coincidente disponible para la raíz de validación (3)
Fondo
Valide un documento XML usando 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 :
file.xml: 4: receta de elemento: Error de validez de esquema: Elemento ''receta'': No hay declaración global coincidente disponible para la raíz de validación.
Pregunta
¿Cuál es la sintaxis correcta (o qué atributos de esquema faltan) para garantizar que el esquema dado se pueda usar para validar con éxito el documento XML dado?
En mi práctica, obtuve la 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, agregar losxmlns
ayudará:<recipe xmlns="http://www.namespace.org/recipe"> ... </recipe>
Necesita cambiar su instancia de XML. Su actual dice que está buscando un tipo llamado descripción en el espacio de nombres http://www.namespace.org/recipe . Sin embargo, los únicos tipos expuestos en ese espacio de nombres se llaman receta y descriptionType .
Por lo tanto, defina un tipo denominado descripción en el esquema XSD o cambie su instancia para que haga referencia al tipo de receta 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>
Solo las definiciones de elementos globales se pueden usar como elementos raíz. Su esquema solo tiene tipos complejos y, por lo tanto, el error. Cambie el <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 here