2

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.

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

5.

<arrivalDate>later</arrivalDate>
<presentee>
    <firstName>User</firstName>
</presentee>

6.

<arrivalDate>later</arrivalDate>
<departureDate>5</departureDate> <!-- 1 till 5 extra days -->
<presentee>
    <firstName>User</firstName>
</presentee>

ケース 5 と 6 は、presentee が設定されている場合にのみ可能です。

これを処理するためのスキーマを作成しました。

<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>

問題を処理するために、構造にいくつかの変更を試みましたが、「良い」解決策が得られません。

4

2 に答える 2

3

XML スキーマが非決定論的である理由は、それを XML ドキュメントに適用するときに、arrivalDate と departmentDate のどちらの定義を意味するかを決定できないためです。あなたの考え方では、最初の<choice>ディレクティブは、これらの要素の 1 つの定義セットの後に presentee 要素が続くか、presentee 要素を含まない別の定義のいずれかを選択できるというものです。残念ながら、XML スキーマはいくつかの先読みを実行しません。

解析時に、XML イベントはバリデーターに 1 つずつ提示されます。したがって、arrivalDate がスキーマに与えられ、要素が有効かどうかを知る必要がありますが、これらの到着日の定義のどれが適用されるかを判断できません。特定の子要素が欠落しているために要素が無効であると判断する場合と同様に、後続の要素を解析したときにその決定を後回しにすることができれば可能です。しかし、それらが別々であることを考えると、これはこの方法では不可能です。

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

于 2016-02-11T17:53:14.083 に答える
2

これは、XSD1.0で処理できるものではありません。XSDモデルは決定論的であり、あなたが理解しているように、あなたの言語は決定論的ではありません。

unionを使用して、日付または特定の文字列値のいずれかであるタイプを指定できますが、XSDには、到着/出発が単なる日付ではない場合に後の要素が存在する必要があることを指定できるものはありません。

XSD 1.1があなたにとっての選択肢であるかどうかはわかりませんが、それはあなたを助けるかもしれないアサーションを持っています。

于 2012-02-16T17:23:54.337 に答える