晚上好,我正在尝试为我需要验证的某些XML构建架构,但是当我使用验证工具时,我收到以下错误:
错误!!!检测到可能的递归(元素'框')。请改正 你的架构,然后再试一次。
以下是我希望能够使用模式处理的XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<document xmlns="http://somewhere.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://somewhere.com/xml/onxy/onyx.xsd"
version="0.1">
<surface title="Test Surface">
<meta name="Author" content="Somebody" />
<link rel="stylesheet" type="text/css" href="example.css" />
<layout>
<box id="box1">
<text>Hello World</text>
<box>
<text>How Are You</text>
<text>Today</text>
</box>
</box>
</layout>
</surface>
</document>
以下是导致错误的XML Schema:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://somewhere.com"
xmlns:onyx="http://somewhere.com"
elementFormDefault="qualified">
<!-- A container for multiple sufrace elements. -->
<xs:element name="document">
<xs:complexType>
<xs:sequence>
<xs:element name="surface" type="onyx:SurfaceType" minOccurs="1"/>
</xs:sequence>
<xs:attribute name="version" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:complexType name="SurfaceType">
<xs:sequence>
<xs:element name="meta" type="onyx:MetaType" />
<xs:element name="link" type="onyx:LinkType" />
<xs:element name="layout" type="onyx:LayoutType" minOccurs="1" maxOccurs="1" />
</xs:sequence>
<xs:attribute name="title" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType name="LayoutType">
<xs:sequence>
<xs:element name="box" type="onyx:ContentType" />
<xs:element name="text" type="onyx:ContentType" />
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:complexType name="ContentType" mixed="true">
<xs:sequence>
<xs:element name="box" type="onyx:ContentType" />
<xs:element name="text" type="onyx:ContentType" />
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:complexType name="MetaType">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="content" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType name="LinkType">
<xs:attribute name="rel" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
<xs:attribute name="href" type="xs:string" use="required" />
</xs:complexType>
</xs:schema>
只是为了澄清这意味着我希望将box
和text
元素的子项限制为名称box
和text
,但不限制可以发生的次数和深度递归可以去。
我不会问是否在网上搜索过,所以请你提供任何帮助。
答案 0 :(得分:0)
您当前的架构要求每个onyx:box
元素包含另一个onyx:box
元素,因此示例中的内部框格无效(与其他每个有限的XML文档一样)。
与任何递归一样,您需要提供非递归基本步骤以及递归步骤;在内容模型术语中,必须允许任何嵌套在其自身内的元素不包含自身。您的验证器似乎足够聪明,可以通知并尝试提供帮助。
(您的ContentType也不允许使用两个text
元素,因此它也无法以这种方式描述您的示例,但我认为您可以清除它。)