XSD два элемента с одинаковой внутренней структурой

Я работаю с XSD, пытаясь получить его для проверки XML.

XML используется для создания объектов. Есть два типа объектов, которые могут быть созданы элементами в списке: SC и SMSC. SMSC является СЦ, и расширяет его.

SMSC не содержит никаких новых свойств. С точки зрения xml, SMSC во всех отношениях идентичен SC, за исключением того, что элементы, определяющие его свойства, заключены в <SMSC> теги вместо <SC> теги.

Наш XSD выглядит так:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name='Definitions'>
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element maxOccurs="unbounded" name="SC">
          <!--SNIP properties of SC and SMSC -->
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Есть ли способ изменить это, чтобы разрешить SC или SMSC в качестве элемента, кроме дублирования всех определений свойств в элементе SMSC? Мы не хотим удваивать длину документа и дублировать все определения свойств.

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

1 ответ

Решение

Пока это сбивает с толку by tags instead of tags, Я думаю, что ниже либо отвечает на ваш вопрос, либо вызывает лучшие объяснения.

Итак, что вы видите, избегаете дублирования; вам на самом деле не нужен дополнительный тип SMSC (см. Definitions2), но я поставил его на всякий случай (Definitions). Создание элемента SMSC типа SC будет работать точно так же.

Разница между Определениями / Определениями2 и Определениями3 заключается в том, что вместо выбора используются группы подстановки. Я лично предпочитаю группы замещения выбору, но нередко сталкиваюсь с проблемами, связанными с группами замещения (т.е. они плохо поддерживаются здесь и там).

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:complexType name="SC">
        <xsd:sequence>
            <!-- Stuff goes here -->
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="SMSC">
        <xsd:complexContent>
            <xsd:extension base="SC"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:element name="Definitions">
        <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
                <xsd:element name="SC" type="SC"/>
                <xsd:element name="SMSC" type="SMSC"/>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
    <!-- Another way -->
    <xsd:element name="Definitions2">
        <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
                <xsd:element name="SC" type="SC"/>
                <xsd:element name="SMSC" type="SC"/>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Definitions3">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="SC" maxOccurs="unbounded"/>               
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="SC" type="SC" />                 
    <xsd:element name="SMSC" type="SMSC" substitutionGroup="SC" />              
</xsd:schema>
Другие вопросы по тегам