Поделиться через


Основные сведения об ограничении однозначного соответствия примитивов

В XSD сложные модели содержимого ограничены правилом ограничения однозначного соответствия примитивов. Это правило требует, чтобы каждый элемент в экземпляре документа однозначно соответствовал единственному примитиву <xsd:element> или <xsd:any> в родительской модели содержимого. Любая схема, которая содержит тип с потенциально неоднозначной моделью содержимого, отклоняется.

Чаще всего неоднозначность возникает при использовании символов-шаблонов <xsd:any> и примитивов, имеющих переменные диапазоны, например minOccurs < maxOccurs. Следующая модель содержимого является неоднозначной, поскольку элемент <e1> может соответствовать элементам <xsd:element> и <xsd:any> .

<xsd:element name="root">
    <xsd:complexType>
        <xsd:choice>
            <xsd:element name="e1"/>
            <xsd:any namespace="##any"/>
        </xsd:choice>
    </xsd:complexType>
</xsd:element>

Следующая модель содержимого также является неоднозначной:

<xsd:element name="root">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="e1" maxOccurs="2"/>
            <xsd:element name="e2" minOccurs="0"/>
            <xsd:element name="e1"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

В отличие от документа <root><e1/><e2/><e1/></root>, документ <root><e1/><e1/></root> является неоднозначным, поскольку неясно, к какому элементу <xsd:element> относится второй элемент <e1/>. Даже если документы можно проверить однозначно, схема будет отклонена, поскольку возможность неоднозначности существует.

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

<xsd:element name="root">
    <xsd:complexType>
        <xsd:choice>
           <xsd:sequence>
               <xsd:element name="e1"/>
               <xsd:element name="e2"/>
           </xsd:sequence>
           <xsd:sequence>
               <xsd:element name="e1"/>
               <xsd:element name="e3"/>
           </xsd:sequence>
       </xsd:choice>
    </xsd:complexType>
</xsd:element>

Для такого документа, как <root><e1/><e3/></root>, последовательность <e1/><e3/> однозначно совпадает со вторым элементом <xsd:sequence>. Тем не менее, поскольку элемент <xsd:element>, к которому относится <e1/>, нельзя определить, не заглядывая вперед в <e3/>, модель содержимого нарушает правило ограничения однозначного соответствия примитивов.

Дополнительные сведения

Следующий документ опубликован консорциумом World Wide Web (W3C) и содержит техническое описание ограничения однозначного соответствия примитивов:

«XML-схема. Часть 1, структуры, второе издание, W3C Proposed Edited Recommendation»:

  • Раздел 3.8.6: Ограничения компонентов схемы группы моделей

  • Приложение H: Анализ ограничения однозначного соответствия примитивов (не нормативный)

Эти документы можно найти по адресу http://www.w3.org/TR/xmlschema-1.