Search code examples
javaxmlxsdxsd-validationxml-validation

cvc-elt.1: Cannot find the declaration of element 'change-set'


I'm trying to use some open-source software for RFID services (GitHub: fosstrak capturing application) from a few years ago and there's this error that I can't fix.

(null: 3, 230): cvc-elt.1: Cannot find the declaration of element 'change-set'.

I'm using Docker to containerise the application running Tomcat7 with Java8.

The XML looks like this:

<?xml version="1.0" encoding="utf-8" ?>
<change-set xmlns="http://drools.org/drools-5.0/change-set" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://drools.org/drools-5.0/change-set.xsd http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.0.xsd">
  <add>
    <resource source="classpath:drools/SimpleEPCISDocument.drl" type="DRL" />
  </add>
</change-set>

And the XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            elementFormDefault="qualified" 
            targetNamespace="http://drools.org/drools-5.0/change-set" 
            xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns:change-set="http://drools.org/drools-5.0/change-set">
  <xsd:import namespace="http://www.w3.org/2001/XMLSchema-instance"/>
  <xsd:element name="change-set">
    <xsd:complexType>
      <xsd:choice>
        <xsd:element ref="change-set:add"/>
        <xsd:element ref="change-set:remove"/>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="add">
    <xsd:complexType mixed="true">
      <xsd:sequence>
        <xsd:element minOccurs="0" maxOccurs="unbounded" ref="change-set:resource"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="remove">
    <xsd:complexType mixed="true">
      <xsd:sequence>
        <xsd:element minOccurs="0" maxOccurs="unbounded" ref="change-set:resource"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="resource">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:any minOccurs="0"/>
        <xsd:element minOccurs="0" ref="change-set:decisiontable-conf"/>
      </xsd:sequence>
      <!-- URL to the resource, can be file based -->
      <xsd:attribute name="source" use="required" type="xsd:anyURI"/>
      <!-- for example, DRL, or PKG -->
      <xsd:attribute name="type" use="required" type="xsd:string"/>
      <xsd:attribute name="basicAuthentication" type="xsd:string"/>
      <xsd:attribute name="username" type="xsd:string"/>
      <xsd:attribute name="password" type="xsd:string"/>
    </xsd:complexType>

  </xsd:element>
  <xsd:element name="decisiontable-conf">
    <xsd:complexType>
      <xsd:attribute name="input-type" use="required" type="xsd:NCName"/>
      <xsd:attribute name="worksheet-name" use="required" type="xsd:NCName"/>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Solution

  • Change

    xs:schemaLocation="http://drools.org/drools-5.0/change-set.xsd [...]
    

    to

    xs:schemaLocation="http://drools.org/drools-5.0/change-set [...]
    

    because schemaLocation must be a series of pairs of namespace URIs and XSD locations. In this case, the namespace URI is http://drools.org/drools-5.0/change-set, which matches the namespace of the root element in your XML and the target namespace of your XSD.

    See also

    You'll also have to deal with a subsequent Unique Particle Attribute issue, but that's a separate matter deserving its own question if you're unable to resolve. Start with XSD validation - ANY in SEQUENCE ("Unique Particle Attribution").