Guten Abend, Ich versuche, ein Schema für einige XML zu erstellen, die ich brauche, aber zu überprüfen, wenn ich ein Validierungstool verwenden, erhalte ich folgende Fehlermeldung:XSD Mögliche Rekursion erkannt
Error!!! Possible recursion detected (element 'box'). Please correct your schema and try again.
Hier ist die XML ich möchte mit dem Schema zu handhaben zu können:
<?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>
Und hier ist das XML-Schema, das den Fehler verursacht:
<?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>
Um dies zu verdeutlichen, möchte ich Kinder von box
und text
Elemente auf die Namen box
und text
beschränken, aber nicht einschränken, wie viele auftreten können und wie tief die Rekursion gehen kann.
Ich hätte nicht gefragt, ob nicht online und SO gründlich gesucht, danke für jede Hilfe, die Sie anbieten können.
Nur auf dieser Antwort zu erweitern: die Fehlermeldung ist ein bisschen irreführend, weil es vorschlägt, dass ein Schema nicht rekursiv sein kann, was natürlich nicht der Fall ist. Das Problem hierbei ist, dass es sich um eine nicht terminierende Rekursion handelt. Tatsächlich gibt es in der Spezifikation keine Regel gegen ein solches Schema, aber da das Schema niemals gültige (endliche) Instanzen haben kann, ist es vernünftig, dass der Prozessor Ihnen davon erzählt. –
Was ich versuche, das Schema zu erkennen, ist, dass eine Box oder ein Textelement nur Box- oder Textelemente enthalten kann. Gibt es keine Möglichkeit, das in xsd auszudrücken? – Kodaloid
Ja, natürlich gibt es das, aber ich werde es nicht für dich aufschreiben; Mein Ziel ist es, Ihnen zu helfen, es selbst zu entdecken. Ihr aktuelles Schema ist ein erster Schritt, aber es scheint nicht zu sagen, was Sie sagen möchten, da Ihre Beispieleingabe nicht gültig ist. Lies die Antwort und den Kommentar von MK und denke nach. Dann schaue dir minOccurs an und überlege dir, wie das helfen könnte, einen Typ zu definieren, gegen den alle Vorkommen von onyx: box in deiner Instanz gültig wären. –