Тип: Булево. Указывает, является ли данное объявление ссылкой.
Полное описание, параметры и ограничения
ОбъявлениеАтрибутаXS.ЭтоСсылка (XSAttributeDeclaration.IsReference)
ОбъявлениеАтрибутаXS (XSAttributeDeclaration)
ЭтоСсылка (IsReference)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: Булево.
Указывает, является ли данное объявление ссылкой.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Примечание:
Истина - объявление является ссылкой.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Разрешить две ссылки из анонимного типа wrapper
Локальные ref указывают на глобальные note и currency. Ссылка, использование атрибута и реальное объявление — разные объекты.
Где и как запускать
Полный модуль серверного общего модуля УчебныеЗадачи (флаг Сервер) в учебной базе. Вызовите ВыполнитьПример() из серверного обработчика своей обработки. Вставляйте обе процедуры на уровне модуля.
Подготовка
Выполните каждый полный модуль отдельно на сервере учебной базы. Вызовите ВыполнитьПример(); функция чтения схемы включена ниже в том же модуле.
Схема включена строкой. note — учебное примечание, currency — фиксированная валюта, wrapper содержит ссылки на них. Обмен и рабочие объекты не используются.
Нет DTD, импорта, файлов, сети или записи данных базы. Проверить проверяет XSD, а не XML-экземпляр товара.
Имена и namespace берите из собственной схемы. Не заменяйте их случайным узлом внешнего сервиса.
Процедура ВыполнитьПример() Экспорт
ТекстXSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:declarations"" targetNamespace=""urn:guide:declarations"" elementFormDefault=""qualified"" attributeFormDefault=""unqualified""><xs:element name=""note"" type=""xs:string"" default=""Без примечания"" nillable=""true""><xs:annotation><xs:documentation xml:lang=""ru"">Учебное примечание</xs:documentation></xs:annotation></xs:element><xs:attribute name=""currency"" type=""xs:string"" fixed=""RUB""><xs:annotation><xs:documentation xml:lang=""ru"">Учебная валюта</xs:documentation></xs:annotation></xs:attribute><xs:element name=""wrapper""><xs:complexType><xs:sequence><xs:element ref=""g:note""><xs:annotation><xs:documentation>Ссылка на примечание</xs:documentation></xs:annotation></xs:element></xs:sequence><xs:attribute ref=""g:currency"" use=""optional""><xs:annotation><xs:documentation>Использование валюты</xs:documentation></xs:annotation></xs:attribute></xs:complexType></xs:element></xs:schema>";
Схема = ПрочитатьСвоюСхему(ТекстXSD);
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Исходная собственная XSD не прошла проверку";
КонецЕсли;
Обёртка = Схема.ОбъявленияЭлементов.Получить("wrapper", "urn:guide:declarations");
Если Обёртка = Неопределено Тогда
ВызватьИсключение "Не найден wrapper";
КонецЕсли;
ТипОбёртки = Обёртка.АнонимноеОпределениеТипа;
Если ТипЗнч(ТипОбёртки) <> Тип("ОпределениеСоставногоТипаXS") Тогда
ВызватьИсключение "У wrapper нужен анонимный составной тип";
КонецЕсли;
Группа = ТипОбёртки.Содержимое.Часть;
Если ТипЗнч(Группа) <> Тип("ГруппаМоделиXS") Или Группа.Фрагменты.Количество() <> 1 Тогда
ВызватьИсключение "В wrapper должна быть одна собственная ссылка элемента";
КонецЕсли;
СсылкаЭлемента = Группа.Фрагменты.Получить(0).Часть;
Если ТипЗнч(СсылкаЭлемента) <> Тип("ОбъявлениеЭлементаXS") Тогда
ВызватьИсключение "Получен не элемент схемы";
КонецЕсли;
Сообщить(СсылкаЭлемента.ЭтоСсылка);
Сообщить(СсылкаЭлемента.Ссылка.URIПространстваИмен = "urn:guide:declarations" И СсылкаЭлемента.Ссылка.ЛокальноеИмя = "note");
РеальноеПримечание = СсылкаЭлемента.РазрешитьСсылку();
Если РеальноеПримечание = Неопределено Тогда
ВызватьИсключение "Не разрешена ссылка на note";
КонецЕсли;
Сообщить(РеальноеПримечание = Схема.ОбъявленияЭлементов.Получить("note", "urn:guide:declarations"));
Если ТипОбёртки.Атрибуты.Количество() <> 1 Тогда
ВызватьИсключение "В wrapper нужен один атрибут";
КонецЕсли;
Использование = ТипОбёртки.Атрибуты.Получить(0);
СсылкаАтрибута = Использование.ОбъявлениеАтрибута;
Если СсылкаАтрибута = Неопределено Тогда
ВызватьИсключение "Не получено объявление использования атрибута";
КонецЕсли;
Сообщить(СсылкаАтрибута.ЭтоСсылка);
Сообщить(СсылкаАтрибута.Ссылка.URIПространстваИмен = "urn:guide:declarations" И СсылкаАтрибута.Ссылка.ЛокальноеИмя = "currency");
РеальнаяВалюта = СсылкаАтрибута.РазрешитьСсылку();
Если РеальнаяВалюта = Неопределено Тогда
ВызватьИсключение "Не разрешена ссылка на currency";
КонецЕсли;
Сообщить(РеальнаяВалюта = Схема.ОбъявленияАтрибутов.Получить("currency", "urn:guide:declarations"));
Сообщить(Использование.ЛексическоеЗначение);
Сообщить(Использование.Значение);
КопияИспользования = Использование.КлонироватьКомпоненту(Истина);
Если ТипЗнч(КопияИспользования) <> Тип("ИспользованиеАтрибутаXS") Или КопияИспользования.Аннотация = Неопределено Тогда
ВызватьИсключение "Не получена копия использования с аннотацией";
КонецЕсли;
Сообщить(КопияИспользования.Содержит(КопияИспользования.Аннотация));КонецПроцедуры
Функция ПрочитатьСвоюСхему(ТекстXSD)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXSD);
Попытка
ПостроительДерева = Новый ПостроительDOM;
ДокументСхемы = ПостроительДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
ПостроительСхем = Новый ПостроительСхемXML;
Результат = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Результат = Неопределено Тогда
ВызватьИсключение "Не построена собственная схема";
КонецЕсли;
Возврат Результат;
КонецФункцииРазбор по шагам
АнонимноеОпределениеТипа берётся у wrapper и проверяется как составной тип.
В последовательности ровно один фрагмент, поэтому после проверки безопасно получить индекс 0.
Локальное объявление ref содержит QName, РазрешитьСсылку возвращает реальное глобальное объявление note.
Атрибуты составного типа содержат ИспользованиеАтрибутаXS. Сначала читаем его ОбъявлениеАтрибута, затем разрешаем ref на currency.
ЛексическоеЗначение и Значение использования показываются фактически: фиксированное RUB объявлено в глобальном атрибуте, а не добавлено локальному ref.
Рекурсивная копия локального использования содержит свою аннотацию, но не присоединяется к исходной схеме.
Как проверить результат
Первые шесть проверочных сообщений Истина. Затем показываются фактические поля значения локального использования; они не объявляются обязательной копией fixed глобального атрибута.
Последнее сообщение Истина о принадлежности аннотации копии. Оба РазрешитьСсылку возвращают исходные глобальные объявления.
Ожидаемый результат
Ссылки разрешаются через API, без угадывания имени по строковому префиксу.
На что обратить внимание
Не считайте локальное ref самостоятельным новым глобальным объявлением.
Не путайте атрибут XML с ИспользованиеАтрибутаXS в модели схемы.
Копирование ref не выдается за независимое копирование всех глобальных объявлений.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Отличить объявление атрибута code от его обязательного использования
У Product один обязательный атрибут code типа Sku. Читаем фактический список атрибутов и определение типа, не ищем локальный code среди глобальных атрибутов схемы.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В схеме code объявлен внутри Product с use=required; глобальных xs:attribute в ней нет.
Запустите код на сервере учебной базы с исходной схемой из начала примера.
XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema""
| xmlns:g=""urn:guide:product"" targetNamespace=""urn:guide:product""
| elementFormDefault=""qualified"" version=""1.0"" xml:lang=""ru"">
| <xs:annotation><xs:documentation>Учебный товар, не контракт внешнего API</xs:documentation></xs:annotation>
| <xs:simpleType name=""Sku""><xs:restriction base=""xs:string"">
| <xs:length value=""4""/><xs:pattern value=""[A-Z][0-9]{3}""/>
| </xs:restriction></xs:simpleType>
| <xs:complexType name=""Product""><xs:sequence>
| <xs:element name=""name"" type=""xs:string""/>
| <xs:element name=""quantity"" type=""xs:nonNegativeInteger""/>
| <xs:element name=""note"" type=""xs:string"" minOccurs=""0""/>
| </xs:sequence><xs:attribute name=""code"" type=""g:Sku"" use=""required""/>
| </xs:complexType>
| <xs:element name=""product"" type=""g:Product""/>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
ЧтениеДерева = Новый ПостроительDOM;
ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
ТипТовара = Схема.ОпределенияТипов.Получить("Product", "urn:guide:product");
Сообщить(ТипТовара.Атрибуты.Количество() = 1);
ФактическиеАтрибуты = ТипТовара.ИспользованиеАтрибутов();
Сообщить(ФактическиеАтрибуты.Количество() = 1);
ИспользованиеКода = ФактическиеАтрибуты.Получить(0);
Сообщить(ФактическиеАтрибуты.Содержит(ИспользованиеКода));
Сообщить(ИспользованиеКода.Обязательный);
Сообщить("Категория использования: " + Строка(ИспользованиеКода.Использование));
Сообщить("Ограничение fixed/default: " + Строка(ИспользованиеКода.Ограничение));
Код = ИспользованиеКода.ОбъявлениеАтрибута;
Сообщить(Код.Имя = "code");
Сообщить(Не Код.ЭтоГлобальноеОбъявление);
Сообщить(Не Код.ЭтоСсылка);
Сообщить(Код.АнонимноеОпределениеТипа = Неопределено);
Сообщить("Форма атрибута: " + Строка(Код.Форма));
Сообщить("URI атрибута: [" + Код.URIПространстваИмен + "]");
ТипКода = Код.ОпределениеТипа();
Сообщить(ТипКода.Имя = "Sku");
Сообщить(ТипКода.URIПространстваИмен = "urn:guide:product");
Сообщить(ТипКода.Фасеты.Количество() = 2);
Сообщить(Схема.ОбъявленияАтрибутов.Количество() = 0);Разбор по шагам
Атрибуты показывает собственное описание типа, ИспользованиеАтрибутов — фактический список, включая наследуемые атрибуты.
Из фиксированного списка получаем использование атрибута. Обязательный отражает use=required.
ОбъявлениеАтрибута описывает имя, форму и тип. Обязательность использования не следует угадывать по имени code.
Атрибут не ссылка ref и не анонимный тип: ОпределениеТипа возвращает именованный Sku.
По умолчанию атрибуты этой схемы неквалифицированные, даже при qualified для элементов. URI самого атрибута отличается от URI его типа.
Глобальная коллекция ОбъявленияАтрибутов пуста — это не означает, что у Product нет атрибутов.
Как проверить результат
Один собственный и один фактический атрибут; обязательность Истина.
Имя code, тип Sku в urn:guide:product, два фасета типа.
Атрибут локальный, не ref, глобальных объявлений атрибутов ноль.
Ожидаемый результат
На конкретном обязательном атрибуте отделены использование, объявление, пространство имени и определение типа.
На что обратить внимание
Унаследованные атрибуты могут входить в фактический список, но не в собственный список нового типа.
Отсутствующий атрибут и атрибут с пустой строкой — разные случаи; Sku дополнительно ограничен длиной/образцом.
URI типа атрибута не нужно переносить на имя самого XML-атрибута автоматически.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.