首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSD模式错误,预计基类型将是一个复杂类型,如何修复?

XSD模式错误,预计基类型将是一个复杂类型,如何修复?
EN

Stack Overflow用户
提问于 2014-03-24 00:43:45
回答 2查看 3.2K关注 0票数 1

不确定发生了什么,但是当我试图验证我的模式时,我得到了这个错误:

复杂类型'Tnamedefinition':如果使用,基本类型应该是一个复杂类型。基类型“{http://www.w3.org/2001/XMLSchema}string”是一个简单类型。

以下是我的xml文件:

代码语言:javascript
复制
<league year="2014" source="www.ico.org"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="champions.xsd">
    <sources>
        <source metalane="top">
                    <champion name="wukong">
                            <popularity>8.18</popularity>
                            <banrate>0.51</banrate>
                    </champion>
                    <champion name="renekton">          
                            <popularity>24.26</popularity>
                            <banrate>8.69</banrate>
                    </champion>
                    <champion name="riven">
                            <popularity>11.75</popularity>
                            <banrate>12.85</banrate>
                    </champion>     
                    <champion name="drmundo">
                            <popularity>12.11</popularity>
                            <banrate>64.46</banrate>
                    </champion>     
        </source>

        <source metalane="mid">
                <champion name="ziggs">
                        <popularity>15.09</popularity>
                        <banrate>20.56</banrate>
                </champion>     
                <champion name="gragas">
                        <popularity>22.45</popularity>
                        <banrate>25.89</banrate>
                </champion>
                <champion name="kayle">
                        <popularity>13.63</popularity>
                        <banrate>9.37</banrate>
                </champion>
                <champion name="khazix">
                        <popularity>21.71</popularity>
                        <banrate>37.28</banrate>
                </champion>         
        </source>

        <source metalane="marksman">
                <champion name="lucian">
                        <popularity>18.95</popularity>
                        <banrate>1.18</banrate>
                </champion>     
                <champion name="ezreal">
                        <popularity>21.26</popularity>
                        <banrate>0.11</banrate>
                </champion>
                <champion name="draven">
                        <popularity>15.88</popularity>
                        <banrate>5.85</banrate>
                </champion>
                <champion name="jinx">
                        <popularity>34.82</popularity>
                        <banrate>4.98</banrate>
                </champion>     
        </source>
    </sources>
</league>

下面是我的xsd模式文件:

代码语言:javascript
复制
<xs:schema version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">

    <!-- A year is a 4-digit integer, except the year must be >= 1998. -->
    <xs:simpleType name="Tyear">
        <xs:restriction base="xs:integer">
            <xs:pattern value="\d{4}"/>
            <xs:minInclusive value="1998"/>
        </xs:restriction>
    </xs:simpleType>

    <!-- A lane is a string which specifies which location on the map a champion goes -->
    <xs:simpleType name="Tmetalane">
        <xs:restriction base="xs:string">

        </xs:restriction>
    </xs:simpleType>

    <!-- A name is a string which specifies a champions name -->
    <xs:simpleType name="Tname">
        <xs:restriction base="xs:string">

        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Tperc">
        <xs:restriction base="xs:decimal">    
            <xs:minExclusive value="0.0"/>
            <xs:fractionDigits value="2"/>
        </xs:restriction>    
    </xs:simpleType>

    <!-- A definition associates a metalane with a value.  -->
    <xs:complexType name="Tdefinition">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="metalane" type="Tmetalane"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <!-- A name definition associates a champion with a value.  -->
    <xs:complexType name="Tnamedefinition">
        <xs:complexContent>
            <xs:extension base="xs:string">
                <xs:attribute name="name" type="Tname"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>


    <!-- league
    The root element is *league*.
    It contains a sources element which contains multiple source elements.
    -->
    <xs:element name="league">        
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="sources" maxOccurs="unbounded"/>        
            </xs:sequence>
            <xs:attribute name="year" type="Tyear"/>
            <xs:attribute name="source" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <!-- sources
    The *sources* element defines multiple metalanes which
    contain champion information regarding that lane.
    -->
    <xs:element name="sources">        
        <xs:complexType>
            <xs:sequence>
                <xs:element name="source" type="Tdefinition" maxOccurs="unbounded"/>        
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="metalanes">
            <xs:selector xpath="source"/>
            <xs:field xpath="@metalane"/>
        </xs:unique>
    </xs:element>

    <!-- source
    The *source* element contains multiple champion elements
    -->
    <xs:element name="source">        
        <xs:complexType>
            <xs:sequence>
                <xs:element name="champion" type="Tnamedefinition" maxOccurs="unbounded"/>        
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- champion
    The *champion* element contains a banrate and popularity element
    -->
    <xs:element name="champion">        
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="popularity"/>        
                <xs:element ref="banrate"/>
            </xs:sequence>
            <xs:attribute name="name" type="Tname"/>
        </xs:complexType>
    </xs:element>

    <!-- A *popularity* element defines how often a champion is picked  -->
    <xs:element name="popularity">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="Tperc">
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <!-- A *banrate* element defines how often a champion is banned  -->
    <xs:element name="banrate">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="Tperc">
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

</xs:schema>
EN

回答 2

Stack Overflow用户

发布于 2014-03-24 02:24:16

你宣称是<complexContent>。不能使用简单类型(xs:string)作为扩展的基本类型。它一定是一个复杂的类型。

您将<champion>定义为具有匿名嵌套复杂类型的顶级元素,然后在<source>中定义为Tnamedefinition。从XML源中,我认为您应该声明对顶级champion的引用,并删除type声明:

代码语言:javascript
复制
<xs:element name="source">        
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="champion" maxOccurs="unbounded"/>        
        </xs:sequence>
    </xs:complexType>
</xs:element> 

然后可以删除Tnamedefinition的类型声明,这将导致错误。

您在<sources>中也有同样的问题,它不会验证您的文档,因为您将它声明为空。

代码语言:javascript
复制
<xs:element name="sources">        
    <xs:complexType>
        <xs:sequence>
            <xs:element name="source" type="Tdefinition" maxOccurs="unbounded"/>        
        </xs:sequence>
    </xs:complexType>

..。

Tdefinition是一个复杂的类型,其内容简单,只允许一个属性。可以将属性声明移动到<source>元素定义中的复杂类型:

代码语言:javascript
复制
<xs:element name="source">        
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="champion" maxOccurs="unbounded"/>        
        </xs:sequence>
        <xs:attribute name="metalane" type="Tmetalane" />
    </xs:complexType>
</xs:element>

您也不需要Tdefinition,应该将source声明为对顶级元素的引用。

代码语言:javascript
复制
<xs:element name="sources">        
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="source" maxOccurs="unbounded"/>        
        </xs:sequence>
    </xs:complexType>
    ...
</xs:element>

通过这些更改,文档将验证。但是您也有一堆未使用的类型声明,除非您的其他XML实例与这里显示的非常不同,否则您可能不会使用并且可以删除。例如,除非popularitybanrate具有属性,否则可以将它们声明为简单类型:

代码语言:javascript
复制
<xs:element name="popularity" type="Tperc"/>
<xs:element name="banrate" type="Tperc"/>

因为您不在其他地方使用它们,所以也可以在champion定义中嵌套它们。

我假设TmetalaneTname是您仍然在处理的类型(因为这些限制是适当的,但是是空的)。

进行更改并删除未使用的类型,结果模式如下所示:

代码语言:javascript
复制
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <xs:simpleType name="Tyear">
        <xs:restriction base="xs:integer">
            <xs:pattern value="\d{4}"/>
            <xs:minInclusive value="1998"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Tmetalane">
        <xs:restriction base="xs:string">
            <!-- to be added  -->
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Tname">
        <xs:restriction base="xs:string">
            <!-- to be added -->
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Tperc">
        <xs:restriction base="xs:decimal">    
            <xs:minExclusive value="0.0"/>
            <xs:fractionDigits value="2"/>
        </xs:restriction>    
    </xs:simpleType>

    <xs:element name="league">        
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="sources" maxOccurs="unbounded"/>        
            </xs:sequence>
            <xs:attribute name="year" type="Tyear"/>
            <xs:attribute name="source" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="sources">        
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="source" maxOccurs="unbounded"/>        
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="metalanes">
            <xs:selector xpath="source"/>
            <xs:field xpath="@metalane"/>
        </xs:unique>
    </xs:element>

    <xs:element name="source">        
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="champion" maxOccurs="unbounded"/>        
            </xs:sequence>
            <xs:attribute name="metalane" type="Tmetalane" />
        </xs:complexType>
    </xs:element>

    <xs:element name="champion">        
        <xs:complexType>
            <xs:sequence>
                <xs:element name="popularity" type="Tperc"/>
                <xs:element name="banrate" type="Tperc"/>
            </xs:sequence>
            <xs:attribute name="name" type="Tname"/>
        </xs:complexType>
    </xs:element>
</xs:schema>
票数 0
EN

Stack Overflow用户

发布于 2014-03-24 08:40:39

下面是来自Saxon的比较信息:

代码语言:javascript
复制
Error on line 44 of test.xsd:
  The type Tnamedefinition has complex content so it cannot be based on the simple type xs:string

您可以从xs中通过扩展来定义:string是一个“带有简单内容的复杂类型”(也就是说,一个具有属性但没有子元素的元素)。这只是通过将"complexContent“改为"simpleContent”来实现的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22599228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档