我正在尝试创建一个xsd架构,用于验证具有未知深度节点的地图。
(在下面的架构中,我希望mapnode包含更多地图节点等。)
这需要从根节点下面开始的递归。
这里描述的两种方法似乎都不适合我:http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.xml.doc%2Fdoc%2Fc0051286.html
使用下面的架构,我收到此错误: src-resolve:无法将名称'mapnode'解析为(n)'元素声明'组件。
<?xml version="1.0" encoding="utf-16"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="knowledgemap">
<xs:complexType>
<xs:sequence>
<xs:element name="mapdata">
<xs:complexType>
<xs:all>
<xs:element name="title" type="xs:string"/>
<xs:element name="version" type="xs:string"/>
<xs:element name="author" type="xs:string"/>
<xs:element name="authorid" type="xs:string"/>
<xs:element name="width" type="xs:positiveInteger"/>
<xs:element name="height" type="xs:positiveInteger"/>
<xs:element name="xpos" type="xs:positiveInteger"/>
<xs:element name="ypos" type="xs:positiveInteger"/>
<xs:element name="scalefactor" type="xs:float"/>
<xs:element name="mapid" type="xs:string"/>
<xs:element name="beehivedata">
<xs:complexType>
<xs:sequence>
<xs:element name="maxresults" type="xs:positiveInteger"/>
<xs:element name="upiproduct" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="upiproduct" type="xs:string"/>
<xs:element name="upiversion" type="xs:string"/>
<xs:element name="upilanguage" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="styledata">
<xs:complexType>
<xs:sequence>
<xs:element name="nodelevel" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="level"/>
<xs:element name="width"/>
<xs:element name="height"/>
<xs:element name="fontsize"/>
<xs:element name="fontcolor"/>
<xs:element name="fontweight"/>
<xs:element name="strokecolor"/>
<xs:element name="strokewidth"/>
<xs:element name="linkcolor"/>
<xs:element name="linkhighlight"/>
<xs:element name="colorunexplored"/>
<xs:element name="colorexplored"/>
<xs:element name="colorshadow"/>
<xs:element name="iconsize"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="map">
<xs:complexType>
<xs:sequence>
<xs:element name="mapnode">
<xs:complexType>
<xs:sequence>
<xs:element name="nodedata">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="description" type="xs:string"/>
<xs:element name="xpos" type="xs:integer"/>
<xs:element name="ypos" type="xs:integer"/>
<xs:element name="nodeid" type="xs:string"/>
<xs:element name="level" type="xs:positiveInteger"/>
<xs:element name="parent" type="xs:string"/>
<xs:element name="localconnection" type="xs:string"/>
<xs:element name="parentconnection" type="xs:string"/>
<xs:element name="covericon" type="xs:string"/>
<xs:element name="activesocket" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="contentitem" maxOccurs="unbounded">
<xs:complexType>
<xs:all>
<xs:element name="title" type="xs:string"/>
<xs:element name="contentid" type="xs:string"/>
<xs:element name="description" type="xs:string"/>
<xs:element name="type" type="xs:string"/>
<xs:element name="size" type="xs:string"/>
<xs:element name="col" type="xs:positiveInteger"/>
<xs:element name="row" type="xs:positiveInteger"/>
<xs:element name="contenturl" type="xs:string"/>
<xs:element name="contenticon" type="xs:string"/>
<xs:element name="contentdata" type="xs:string" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element ref="mapnode" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
答案 0 :(得分:3)
要定义递归结构,您需要将引用自身的节点(或者如果存在循环,循环中的一个节点)转换为全局元素声明。当你使用ref =“name”时,它必须引用一个全局元素 - 一个声明为xs:schema元素的子元素。
答案 1 :(得分:1)
对于需要避免全局元素声明的场景,@ Michael的替代方法是使类型为全局;将元素声明保持为局部,并改为引用全局类型(使用类型属性)。