XSD检测到可能的递归

时间:2017-11-30 01:58:36

标签: xml recursion xsd

晚上好,我正在尝试为我需要验证的某些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>

只是为了澄清这意味着我希望将boxtext元素的子项限制为名称boxtext,但不限制可以发生的次数和深度递归可以去。

我不会问是否在网上搜索过,所以请你提供任何帮助。

1 个答案:

答案 0 :(得分:0)

您当前的架构要求每个onyx:box元素包含另一个onyx:box元素,因此示例中的内部框格无效(与其他每个有限的XML文档一样)。

与任何递归一样,您需要提供非递归基本步骤以及递归步骤;在内容模型术语中,必须允许任何嵌套在其自身内的元素不包含自身。您的验证器似乎足够聪明,可以通知并尝试提供帮助。

(您的ContentType也不允许使用两个text元素,因此它也无法以这种方式描述您的示例,但我认为您可以清除它。)