Какая разница между ref и типом в XML-схеме? - программирование

Какая разница между ref и типом в XML-схеме?

Рассмотрим следующую схему:

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

    <xs:complexType name="Root">
        <xs:sequence>
            <xs:element ref="Child" />
            <xs:element name="Child2" type="Child" />
        </xs:sequence>
        <xs:attribute ref="Att" />
        <xs:attribute name="Att2" type="Att" />
    </xs:complexType>

    <xs:complexType name="Child">
        <xs:attribute ref="Att" />
    </xs:complexType>

    <xs:attribute name="Att" type="xs:integer" />

</xs:schema> 

Сбой ref до "Child" в строке 6, а проверка type в строке 7. Для атрибута ref выполняется успешно, а type - сбой. Я пытаюсь понять, почему.

Мое понимание ref состояло в том, что он просто ссылался на другой элемент и указывал, что вы ожидаете увидеть экземпляр указанного типа (с именем, указанным в определении) в этом месте. Очевидно, я ошибаюсь, так что означает ref?

4b9b3361

Ответ 1

Используя ref = "..", вы "вставляете" существующий элемент/атрибут, определенный на другом месте. Используя type = "..", вы назначаете некоторую структуру (определенную в complextype/simpletype) новому элементу/атрибуту. Посмотрите следующее:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tst="test" targetNamespace="test">

    <xs:complexType name="Root">
        <xs:sequence>
            <xs:element ref="tst:Child" />
            <xs:element name="Child2" type="tst:ChildType" />
        </xs:sequence>
        <xs:attribute ref="tst:AttRef" />
        <xs:attribute name="Att2" type="tst:AttType" />
    </xs:complexType>

    <xs:complexType name="ChildType">
        <xs:attribute ref="tst:AttRef" />
    </xs:complexType>

    <xs:element name="Child">
    </xs:element>

    <xs:simpleType name="AttType">
        <xs:restriction base="xs:string">
            <xs:maxLength value="10" />
        </xs:restriction>
    </xs:simpleType>

    <xs:attribute name="AttRef" type="xs:integer" />

</xs:schema> 

Ответ 2

В рамках модели содержимого элемент xs:element может быть:

  • Объявление элемента (с указанием имени и типа элемента) или
  • Ссылка на объявление элемента верхнего уровня (предоставление имя элемента как способ его идентификации и отложить до фактическое объявление для типа).

(Одно и то же имя/повторное чередование применяется к объявлениям атрибутов и ссылкам атрибутов, и существует аналогичная дихотомия между определениями встроенного типа и ссылками на именованные типы.)

В вашем примере нет объявления верхнего уровня для элемента с именем Child, поэтому атрибут ref терпит неудачу. Надеюсь, это поможет.

Ответ 3

Значительная разница между ref и type заключается в том, что с типом вы не можете идти дальше вниз по уровню, но с помощью ref вы можете использовать элемент, который может иметь дополнительный уровень и т.д.