Модель содержимого XML-схемы не является детерминированной - PullRequest
2 голосов
/ 15 февраля 2012

У меня проблемы с 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 возможны только в том случае, если настроен пред ставитель.

Теперь я создал схему для обработки этого:

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

2 голосов
/ 16 февраля 2012

Это не то, что XSD 1.0 может обработать. XSD-модели являются детерминированными, и, как вы понимаете, ваш язык не является детерминированным.

Вы можете использовать union, чтобы иметь тип, который может быть либо датой, либо некоторыми определенными строковыми значениями, но в XSD нет ничего, что позволяло бы вам указать, что более поздний элемент должен присутствовать, когда прибытие / отправление - это не просто дата.

Я не знаю, подходит ли вам XSD 1.1, но в нем есть утверждения, которые могут вам помочь.

1 голос
/ 11 февраля 2016

Причина, по которой ваша XML-схема является недетерминированной, заключается в том, что при применении ее к XML-документу она не может решить, какое из определений для прибывающих дат и отъездов вы имеете в виду.Вы думаете, что первая директива <choice> дает вам выбор между одним набором определений для этих элементов, за которым следует элемент prestee, или другим определением без элемента prestee.К сожалению, XML-схема не выполняет какой-либо предварительный просмотр.

При синтаксическом анализе события XML представляются валидатору одно за другим.Таким образом, дата прибытия дается вашей схеме, и теперь он должен знать, является ли элемент действительным или нет, но ... он не может выяснить, какое из этих определений даты прибытия применимо.Если бы он мог отложить это решение до более позднего времени, когда он проанализировал последующие элементы, он мог бы, например, как он мог бы решить, что элемент недействителен, пропуская определенные дочерние элементы.Но, учитывая, что они разделены, это невозможно в этом смысле.

W3C XML-схема плоха в двух вещах: неупорядоченный контент и ограничения между узлами.Как предположил Кевин, XML Schema 1.1 может иметь ответ на этот вопрос.Я не работал с этим.Другими вариантами проверки являются RelaxNG, который является более гибким и мощным, чем XML-схема, или Schematron, который допускает именно такую ​​проверку, которая должна идти глубже, чем структура и простые проверки типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...