不确定发生了什么,但是当我试图验证我的模式时,我得到了这个错误:
复杂类型'Tnamedefinition':如果使用,基本类型应该是一个复杂类型。基类型“{http://www.w3.org/2001/XMLSchema}string”是一个简单类型。
以下是我的xml文件:
<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模式文件:
<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>发布于 2014-03-24 02:24:16
你宣称是<complexContent>。不能使用简单类型(xs:string)作为扩展的基本类型。它一定是一个复杂的类型。
您将<champion>定义为具有匿名嵌套复杂类型的顶级元素,然后在<source>中定义为Tnamedefinition。从XML源中,我认为您应该声明对顶级champion的引用,并删除type声明:
<xs:element name="source">
<xs:complexType>
<xs:sequence>
<xs:element ref="champion" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element> 然后可以删除Tnamedefinition的类型声明,这将导致错误。
您在<sources>中也有同样的问题,它不会验证您的文档,因为您将它声明为空。
<xs:element name="sources">
<xs:complexType>
<xs:sequence>
<xs:element name="source" type="Tdefinition" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>..。
Tdefinition是一个复杂的类型,其内容简单,只允许一个属性。可以将属性声明移动到<source>元素定义中的复杂类型:
<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声明为对顶级元素的引用。
<xs:element name="sources">
<xs:complexType>
<xs:sequence>
<xs:element ref="source" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
...
</xs:element>通过这些更改,文档将验证。但是您也有一堆未使用的类型声明,除非您的其他XML实例与这里显示的非常不同,否则您可能不会使用并且可以删除。例如,除非popularity和banrate具有属性,否则可以将它们声明为简单类型:
<xs:element name="popularity" type="Tperc"/>
<xs:element name="banrate" type="Tperc"/>因为您不在其他地方使用它们,所以也可以在champion定义中嵌套它们。
我假设Tmetalane和Tname是您仍然在处理的类型(因为这些限制是适当的,但是是空的)。
进行更改并删除未使用的类型,结果模式如下所示:
<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>发布于 2014-03-24 08:40:39
下面是来自Saxon的比较信息:
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”来实现的。
https://stackoverflow.com/questions/22599228
复制相似问题