Какая разница между 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
?
Ответы
Ответ 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 вы можете использовать элемент, который может иметь дополнительный уровень и т.д.