2017-11-30 20 views
0

こんばんはを検出し、私は検証ツールを使用する場合しかし、私は次のエラーが表示され、私は検証する必要があるいくつかのXMLのスキーマを構築しようとしています:ここでXSD可能な再帰が

Error!!! Possible recursion detected (element 'box'). Please correct your schema and try again.

です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スキーマです:

<?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に制限したいが、再帰が何回起こるか、どのくらい深くできるかを制限しないことを意味する。

オンラインで検索していないかどうか尋ねることはありませんでした。誠にありがとうございます。ご協力いただきありがとうございます。

答えて

0

現在のスキーマでは、すべてのonyx:box要素にもう1つのonyx:box要素を含める必要があるため、例の内部のボックスは無効です(他のすべての有限のXML文書と同じです)。

再帰と同様に、非再帰的な基本ステップと再帰的なステップを提供する必要があります。コンテンツモデルの用語では、それ自体の中に入れ子になっている要素は、それ自身を含まないようにする必要があります。あなたのバリデーターは、気づいて助けようとするほどスマートに見えます。

は(それはあまりにも、そのようにあなたの例を記述するために失敗したので、あなたのContentTypeをも、2つの text要素を許可していませんが、私はあなたがそれをクリアすることができますを前提としています。)

+0

はちょうどこの答えに展開します:スキーマが再帰的ではないことを示唆しているため、エラーメッセージは少し誤解を招く。当然のことではない。ここでの問題は、非終端再帰であるということです。実際、このようなスキーマに対する仕様にはルールはありませんが、スキーマは決して有効な(有限の)インスタンスを持つことはできないので、プロセッサがこれについてあなたに伝えるのは妥当です。 –

+0

スキーマを認識させようとしているのは、ボックスまたはテキスト要素にはボックスまたはテキスト要素しか含めることができないということです。 xsdでそれを表現する方法はありませんか? – Kodaloid

+0

はい、もちろんありますが、私はあなたのためにそれを書くつもりはありません。私の目標は、あなた自身でそれを発見するのを手助けすることです。あなたの現在のスキーマは最初のステップですが、サンプル入力が有効でないとすれば、あなたが言うことを言っているようには見えません。答えとMKのコメントを読んで、もっと頑張ってください。次に、minOccursを調べて、インスタンス内のオニキス:ボックスのすべてのオカレンスが有効となるタイプを定義するのに役立つ方法について考えてみましょう。 –

関連する問題