XML XSD 递归和命名空间

XML XSD recursion and namespaces

我正在努力思考 XSD 中的名称空间和递归,但我感到迷茫。

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

最重要的部分用白线划分,只是学习xsd,但我的一项作业需要它,所以请放轻松...

代码(我试着按照这个 link: Recursive element in XML ,不幸的是没有结果):

<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>

最重要的部分用白线划分,只是学习xsd但我的一项作业需要它,所以请放轻松...

XSD 对元素的递归引用(没有名称空间)

为了递归引用topic,必须全局定义。您的尝试失败了,因为 topic 是在本地定义的。

这会起作用:

<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 对元素的递归引用(带有命名空间)

您在问题中提到了名称空间,但您包含的 XSD 并未尝试定义名称空间。 (如上所示,您的问题本身也与名称空间无关。)但是,上面的 XSD 适合与名称空间一起使用,以防您确实需要它们。请注意,您必须定义命名空间前缀以引用 xs:schema/targetNamespace:

给出的命名空间中的 topic 元素
<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>