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


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

В 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/>, модель содержимого нарушает правило ограничения однозначного соответствия примитивов.

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

Следующий документ, опубликованный консорциумом W3C, содержит техническое описание ограничения однозначного соответствия примитивов.

«XML Schema Part 1: Structures Second Edition, W3C Proposed Edited Recommendation» (на английском языке):

  • Section 3.8.6: Constraints on Model Group Schema Components
  • Appendix H: Analysis of the Unique Particle Attribution Constraint (non-normative)

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

См. также

Справочник

Управление коллекциями XML-схем на сервере

Справка и поддержка

Получение помощи по SQL Server 2005