XSD error: No matching global declaration available for the validation root

XSD error: No matching global declaration available for the validation root

当我尝试验证 XML 文件时出现此错误:

person.xml:3: element person: Schemas validity error : Element {http://www.namespace.org/person}person: No matching global declaration available for the validation root.

这是 person.xml 文件的内容:

<?xml version="1.0"?>
<p:person xmlns:p="http://www.namespace.org/person">
  <firstName>name</firstName>
  <surName>surname</surName>
  <secondName>n2</secondName>
</p:person>

这是 person.xsd 文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:p="http://www.namespace.org/person"   
           version="1.0">

    <xs:element name="person">
        <xs:complexType>
            <xs:group ref="credential"/>
        </xs:complexType>
    </xs:element>

    <xs:group name="credential">
        <xs:sequence>
            <xs:element name="firstName" type="xs:string"/>
            <xs:element name="surName" type="xs:string"/>
            <xs:element name="secondName" type="xs:string"/>
        </xs:sequence>
    </xs:group>     
</xs:schema>

错误表明在给定的 XSD 中找不到命名空间元素 {http://www.namespace.org/person}person,因为 p 元素不在 http://www.namespace.org/person 命名空间中。通过将 targetNamespace="http://www.namespace.org/person" 添加到 XSD 的 xs:schema 根元素来更正此问题。接下来,调整对 credential 组的引用以也使用该命名空间。

总而言之,以下 XML 将对以下 XSD 有效:

XML

<?xml version="1.0"?>
<p:person xmlns:p="http://www.namespace.org/person">
  <firstName>name</firstName>
  <surName>surname</surName>
  <secondName>n2</secondName>
</p:person>

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:p="http://www.namespace.org/person"
  targetNamespace="http://www.namespace.org/person"
  version="1.0">
  
  <xs:element name="person">
    <xs:complexType>
      <xs:group ref="p:credential"/>
    </xs:complexType>
  </xs:element>
  
  <xs:group name="credential">
    <xs:sequence>
      <xs:element name="firstName" type="xs:string"/>
      <xs:element name="surName" type="xs:string"/>
      <xs:element name="secondName" type="xs:string"/>
    </xs:sequence>
  </xs:group>  

</xs:schema>