XML XSD 递归和命名空间 [英] XML XSD recursion and namespaces

查看:60
本文介绍了XML XSD 递归和命名空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试围绕 XSD 中的命名空间和递归进行思考,但我感到迷茫.

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

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

代码(我尝试点击此链接:XML 中的递归元素,不幸的是没有结果):

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>

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

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

推荐答案

XSD 递归引用元素(无命名空间)

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

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.

这会起作用:

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

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

这篇关于XML XSD 递归和命名空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆