Уникальные Нарушения Частиц - PullRequest
2 голосов
/ 16 апреля 2009

Я слишком долго смотрю на эту проблему. Я подозреваю, что упускаю что-то очевидное, потому что я слишком знаком с этим.

У меня есть схема, которая страдает от уникальной ошибки нарушения частицы. Я понимаю почему, но я слишком долго возился с этим, чтобы иметь возможность отступить и решить проблему.

Как мне сформулировать эту схему, чтобы она могла проверять контент, который мне нужно моделировать?

Модель контента выглядит примерно так:

<document>
    <extract>...</extract>
    <structure>...</structure>
    <structure>...</structure>
</document>

OR

<document>
    <structure>...</structure>
    <structure>...</structure>
</document>

OR

<document>
    <extract>...</extract>
    <extract>...</extract>
</document>

То есть элемент document может содержать один или несколько элементов extract или один или несколько элементов Structure или может содержать один экстракт Элемент , за которым следует один или несколько элементов структура .

У меня есть (неправильная) схема, которая выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="document" type="Document"/>
    <xs:complexType name="Document">
        <xs:choice>
            <xs:sequence>
                <xs:element ref="extract" minOccurs="0"/>
                <xs:element ref="structure" minOccurs="1" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:element maxOccurs="unbounded" ref='extract'/>
        </xs:choice>
    </xs:complexType>

    <xs:element name="extract" type="xs:string"/>
    <xs:element name="structure" type="xs:string"/>

</xs:schema>

(Это упрощенная версия гораздо более сложной схемы).

ура

1035 * НИК *

1 Ответ

3 голосов
/ 16 апреля 2009

Итак, вам нужна модель контента в стиле DTD:

extract+|structure+|extract,structure+

Проблема здесь в том, что наличие extract не определяет, какая ветвь берется. Но мы можем переписать модель контента следующим образом:

extract,(structure+|extract*)|structure+

Вы можете видеть, что это то же самое, если вы «расширяете» внутренний выбор, как если бы это была алгебра:

extract,structure+|extract,extract*|structure+
extract,structure+|extract+|structure+     [[ extract,extract* === extract+ ]]

И эта модель контента может быть переведена обратно в XSD:

<xs:complexType name="Document">
 <xs:choice>
  <xs:sequence>
   <xs:element ref="extract"/>
   <xs:choice>
    <xs:element ref="structure" maxOccurs="unbounded"/>
    <xs:element ref="extract" minOccurs="0" maxOccurs="unbounded"/>
   </xs:choice>
  </xs:sequence>
  <xs:element ref="structure" maxOccurs="unbounded"/>
 </xs:choice>
</xs:complexType>
...