2012-02-15 15 views
2

xmlスキーマに問題があります。XMLスキーマのコンテンツモデルが確定的ではありません

まず、私はあなたに、XMLの可能性のある例を示したい:

1.

<arrivalDate>01.01.2012</arrivalDate> 

2.

<arrivalDate>01.01.2012</arrivalDate> 
<departureDate>04.01.2012</departureDate> 

3.

<arrivalDate>01.01.2012</arrivalDate> 
<presentee> 
    <firstName>User</firstName> 
</presentee> 

4.

presenteeが設定されている場合
<arrivalDate>01.01.2012</arrivalDate> 
<departureDate>04.01.2012</departureDate> 
<presentee> 
    <firstName>User</firstName> 
</presentee> 
<arrivalDate>later</arrivalDate> 
<presentee> 
    <firstName>User</firstName> 
</presentee> 
<arrivalDate>later</arrivalDate> 
<departureDate>5</departureDate> <!-- 1 till 5 extra days --> 
<presentee> 
    <firstName>User</firstName> 
</presentee> 

例5及び6のみ可能です。

は今、私はこのハンドルのスキーマ作成しました:

<xs:choice> 
    <xs:sequence> 
     <xs:choice> 
      <xs:sequence> 
       <xs:element name="arrivalDate" type="date" /> 
       <xs:element name="departureDate" type="date" minOccurs="0" maxOccurs="1" /> 
      </xs:sequence> 
      <xs:sequence> 
       <xs:element name="arrivalDate" type="xs:string" fixed="later" /> 
       <xs:element name="departureDate" minOccurs="0" maxOccurs="1"> 
        <xs:simpleType> 
         <xs:restriction base="xs:integer"> 
          <xs:minInclusive value="1" /> 
          <xs:maxInclusive value="5" /> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
      </xs:sequence> 
     </xs:choice> 
     <xs:element name="presentee" minOccurs="1" maxOccurs="1"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element name="title" type="title"/> 
        <xs:element name="firstName" type="name" /> 
        <xs:element name="lastName" type="name" /> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    <xs:sequence> 
     <xs:element name="arrivalDate" type="date" /> 
     <xs:element name="departureDate" type="date" minOccurs="0" maxOccurs="1" /> 
    </xs:sequence> 
</xs:choice> 

を私はこの問題をヘンデルために、構造にいくつかの変更を試みたが、イムは「素敵な」解決策を得ることはありません。

答えて

2

これはXSD 1.0が処理できるものではありません。 XSDモデルは決定的であり、実現しているときには言語は決定的ではありません。

ユニオンを使用して、日付または特定の文字列値のいずれかの型を指定できますが、到着/出発が単なる日付ではなく、後の要素が存在する必要があることをXSDに指定することはできません。

XSD 1.1があなたのためのオプションであるかどうかはわかりませんが、アサーションがあります。

1

あなたのXMLスキーマが非決定論的な理由は、それをXML文書に適用すると、arrivalDateとdepartureDateのどちらの定義を決定することができないからです。最初の<choice>ディレクティブは、これらの要素の定義の1つのセットか、presenteeエレメントか、presenteeエレメントのない別の定義のいずれかを選択できるようになっています。残念ながら、XMLスキーマはいくつかの先読みを実行しません。

構文解析時に、XMLイベントが1つずつバリデーターに提示されます。したがって、arrivalDateはスキーマに与えられ、要素が有効かどうかを知る必要がありますが、これらの到着日付定義のうちのどれが適用されるかはわかりません。その決定を後の要素を解析した後に延期することができれば、要素を決定する方法のように、特定の子要素を欠いて無効とすることができます。しかし、彼らが分離していることを考えると、これはこのようには不可能です。

W3C XMLスキーマは、順序付けされていないコンテンツとノード間の制限という2つの点で悪いです。 Kevinが提案したように、XML Schema 1.1にはこれに対する答えがあるかもしれません。私はそれで働いていない。チェックするその他のオプションは、RelaxNGです。RelaxNGは、XML SchemaやSchematronよりも柔軟で強力です。構造や単純な型チェックより深くする必要があるこの種の検証が可能です。

関連する問題