1

I'm trying to wrap my head around namespaces and recursion in XSD and I feel lost.

Error: The QName value 'topic' does not resolve to a(n) element declaration

Most important part is divided with whitelines, just learning xsd but I need it for one of my assignments, so please, take it easy...

Code (I tried to follow this link: Recursive element in XML , unluckily no results):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name='xmap-content'>
    <xs:complexType>
      <xs:sequence>
        <xs:element name='sheet'>
          <xs:complexType>
            <xs:sequence>

              <xs:element name='topic'>
                <xs:complexType>
                  <xs:sequence minOccurs="0" maxOccurs="unbounded">
                    <xs:element name='title' type='xs:string'/>
                    <xs:element name='children' minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name='topics'>
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element ref='topic' minOccurs="0"
                                            maxOccurs="unbounded"/>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>

            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Most important part is divided with whitelines, just learning xsd but I need it for one of my assignments, so please, take it easy...

Community
  • 1
  • 1
xxxxx
  • 159
  • 9

1 Answers1

2

XSD recursive reference to an element (without namespaces)

In order to reference topic recursively, it must be defined globally. Your attempt is failing because topic is defined locally.

This will work:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name='xmap-content'>
    <xs:complexType>
      <xs:sequence>
        <xs:element name='sheet'>
          <xs:complexType>
            <xs:sequence>
              <xs:element ref='topic' minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name='topic'>
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name='title' type='xs:string'/>
        <xs:element name='children' minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name='topics'>
                <xs:complexType>
                  <xs:sequence>
                    <xs:element ref='topic' minOccurs="0" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XSD recursive reference to an element (with namespaces)

You mention namespaces in your question, but your included XSD makes no attempt to define namespaces. (Your problem as shown above did not have to do with namespaces per se either.) However, here is the above XSD adapted to work with namespaces in case you really did need them. Note that you have to define a namespace prefix to reference topic element in the namespace given by xs:schema/targetNamespace:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:e="http://www.example.com"
           targetNamespace="http://www.example.com">

  <xs:element name='xmap-content'>
    <xs:complexType>
      <xs:sequence>
        <xs:element name='sheet'>
          <xs:complexType>
            <xs:sequence>
              <xs:element ref='e:topic' minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name='topic'>
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name='title' type='xs:string'/>
        <xs:element name='children' minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name='topics'>
                <xs:complexType>
                  <xs:sequence>
                    <xs:element ref='e:topic' minOccurs="0" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>
kjhughes
  • 106,133
  • 27
  • 181
  • 240
  • Embarrasing, without namespaces at least. Well, yes, I do need namespaces, just wanted to start here, you made my life so much easier, thanks. – xxxxx Jan 24 '17 at 01:16
  • 1
    You're welcome. No need to be embarrassed -- the diagnostic message wasn't much help in revealing that your *local* definition `topic` was insufficient. I've added an example that uses namespaces too for you. – kjhughes Jan 24 '17 at 01:31