Тип: ОбъявлениеАтрибутаXS. Определение атрибута схемы XML, использование которого определяет данный компонент.
Полное описание, параметры и ограничения
ИспользованиеАтрибутаXS.ОбъявлениеАтрибута (XSAttributeUse.AttributeDeclaration)
ИспользованиеАтрибутаXS (XSAttributeUse)
ОбъявлениеАтрибута (AttributeDeclaration)
Доступен, начиная с версии 8.1.
Использование:
Чтение и запись.
Описание:
Тип: ОбъявлениеАтрибутаXS.
Определение атрибута схемы XML, использование которого определяет данный компонент.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Изменять отдельные копии модели, фрагмента и атрибута
После сборки preview создаются три независимые рекурсивные копии его частей. Исходная группа, обязательность label и валюта RUB сохраняются.
Где и как запускать
Полный модуль серверного общего модуля УчебныеЗадачи (флаг Сервер) в учебной базе. Вызовите ВыполнитьПример() из серверного обработчика своей обработки. Вставляйте обе процедуры на уровне модуля.
Подготовка
Выполните каждый полный модуль отдельно на сервере учебной базы. Вызовите ВыполнитьПример(); функция чтения схемы включена ниже в том же модуле.
Схема включена строкой. 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 не прошла проверку";
КонецЕсли;
НоваяМетка = Новый ОбъявлениеЭлементаXS;
НоваяМетка.Имя = "label";
НоваяМетка.ИмяТипа = Новый РасширенноеИмяXML("http://www.w3.org/2001/XMLSchema", "string");
НоваяМетка.Форма = ФормаПредставленияXS.Квалифицированная;
ФрагментМетки = Новый ФрагментXS;
ФрагментМетки.МинимальноВходит = 1;
ФрагментМетки.МаксимальноВходит = 1;
ФрагментМетки.Часть = НоваяМетка;
Группа = Новый ГруппаМоделиXS;
Группа.ВидГруппы = ВидГруппыМоделиXS.Последовательность;
Группа.Фрагменты.Добавить(ФрагментМетки);
ФрагментГруппы = Новый ФрагментXS;
ФрагментГруппы.МинимальноВходит = 1;
ФрагментГруппы.МаксимальноВходит = 1;
ФрагментГруппы.Часть = Группа;
НоваяВалюта = Новый ОбъявлениеАтрибутаXS;
НоваяВалюта.Имя = "currency";
НоваяВалюта.ИмяТипа = Новый РасширенноеИмяXML("http://www.w3.org/2001/XMLSchema", "string");
НоваяВалюта.Форма = ФормаПредставленияXS.Неквалифицированная;
ИспользованиеВалюты = Новый ИспользованиеАтрибутаXS;
ИспользованиеВалюты.ОбъявлениеАтрибута = НоваяВалюта;
ИспользованиеВалюты.Использование = КатегорияИспользованияАтрибутаXS.НеОбязательно;
ИспользованиеВалюты.Ограничение = ОграничениеЗначенияXS.Фиксированное;
ИспользованиеВалюты.ЛексическоеЗначение = "RUB";
НовыйТип = Новый ОпределениеСоставногоТипаXS;
НовыйТип.МодельСодержимого = МодельСодержимогоXS.Составная;
НовыйТип.Содержимое = ФрагментГруппы;
НовыйТип.Атрибуты.Добавить(ИспользованиеВалюты);
НовыйКорень = Новый ОбъявлениеЭлементаXS;
НовыйКорень.Имя = "preview";
НовыйКорень.АнонимноеОпределениеТипа = НовыйТип;
Схема.Содержимое.Добавить(НовыйКорень);
Схема.ОбновитьЭлементDOM();
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Составная собственная XSD не прошла проверку";
КонецЕсли;
КопияГруппы = Группа.КлонироватьКомпоненту(Истина);
Если ТипЗнч(КопияГруппы) <> Тип("ГруппаМоделиXS") Или КопияГруппы.Фрагменты.Количество() <> 1 Тогда
ВызватьИсключение "Не получена копия собственной группы";
КонецЕсли;
КопияГруппы.Фрагменты.Очистить();
Сообщить(КопияГруппы.Фрагменты.Количество() = 0);
Сообщить(Группа.Фрагменты.Количество() = 1);
КопияФрагмента = ФрагментМетки.КлонироватьКомпоненту(Истина);
Если ТипЗнч(КопияФрагмента) <> Тип("ФрагментXS") Или ТипЗнч(КопияФрагмента.Часть) <> Тип("ОбъявлениеЭлементаXS") Тогда
ВызватьИсключение "Не получена копия фрагмента с элементом";
КонецЕсли;
КопияФрагмента.МинимальноВходит = 0;
КопияФрагмента.Часть.Имя = "labelCopy";
Сообщить(КопияФрагмента.МинимальноВходит = 0 И КопияФрагмента.Часть.Имя = "labelCopy");
Сообщить(ФрагментМетки.МинимальноВходит = 1 И НоваяМетка.Имя = "label");
КопияИспользования = ИспользованиеВалюты.КлонироватьКомпоненту(Истина);
Если ТипЗнч(КопияИспользования) <> Тип("ИспользованиеАтрибутаXS") Или КопияИспользования.ОбъявлениеАтрибута = Неопределено Тогда
ВызватьИсключение "Не получена копия локального использования атрибута";
КонецЕсли;
КопияИспользования.ЛексическоеЗначение = "USD";
КопияИспользования.ОбъявлениеАтрибута.Имя = "currencyCopy";
Сообщить(КопияИспользования.Содержит(КопияИспользования.ОбъявлениеАтрибута));
Сообщить(ИспользованиеВалюты.ЛексическоеЗначение = "RUB" И НоваяВалюта.Имя = "currency");
Сообщить(Набор.Проверить());КонецПроцедуры
Функция ПрочитатьСвоюСхему(ТекстXSD)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXSD);
Попытка
ПостроительДерева = Новый ПостроительDOM;
ДокументСхемы = ПостроительДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
ПостроительСхем = Новый ПостроительСхемXML;
Результат = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Результат = Неопределено Тогда
ВызватьИсключение "Не построена собственная схема";
КонецЕсли;
Возврат Результат;
КонецФункцииРазбор по шагам
Исходная preview собирается точно как в предыдущем уроке и проходит проверку.
Рекурсивная копия ГруппаМоделиXS имеет собственные фрагменты. Очистить применяется только к коллекции копии, а исходный фрагмент остаётся.
Копия ФрагментXS получает minOccurs=0 и другое локальное имя своего элемента; исходные 1 и label не меняются.
Копия локального ИспользованиеАтрибутаXS получает USD и currencyCopy. Это не копирование глобального ref и не изменение общей валюты схемы.
Ни одна из трёх копий не присоединяется к XSD. Повторная проверка исходного набора подтверждает сохранение собственной схемы.
Как проверить результат
Семь сообщений Истина; в исходной preview по-прежнему обязательная label и фиксированная RUB.
Отдельные копии являются черновиками: их не следует объявлять новыми действующими типами основной схемы.
Ожидаемый результат
Рекурсивные копии собственных частей изменяются без изменения исходной модели.
На что обратить внимание
Не применяйте Очистить к исходной Группа.Фрагменты.
Изолированная копия фрагмента ещё не становится валидной глобальной XSD.
ЯвляетсяПодмножеством не вызывается: в локальной справке отсутствует параметр сравниваемого фрагмента, сигнатуру не угадываем.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Собрать анонимный тип карточки из элементов и фрагментов
Конструкторы создают preview с обязательной строковой label и необязательной фиксированной currency="RUB". Все компоненты присоединяются к своей схеме.
Где и как запускать
Полный модуль серверного общего модуля УчебныеЗадачи (флаг Сервер) в учебной базе. Вызовите ВыполнитьПример() из серверного обработчика своей обработки. Вставляйте обе процедуры на уровне модуля.
Подготовка
Выполните каждый полный модуль отдельно на сервере учебной базы. Вызовите ВыполнитьПример(); функция чтения схемы включена ниже в том же модуле.
Схема включена строкой. 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 не прошла проверку";
КонецЕсли;
НоваяМетка = Новый ОбъявлениеЭлементаXS;
НоваяМетка.Имя = "label";
НоваяМетка.ИмяТипа = Новый РасширенноеИмяXML("http://www.w3.org/2001/XMLSchema", "string");
НоваяМетка.Форма = ФормаПредставленияXS.Квалифицированная;
ФрагментМетки = Новый ФрагментXS;
ФрагментМетки.МинимальноВходит = 1;
ФрагментМетки.МаксимальноВходит = 1;
ФрагментМетки.Часть = НоваяМетка;
Группа = Новый ГруппаМоделиXS;
Группа.ВидГруппы = ВидГруппыМоделиXS.Последовательность;
Группа.Фрагменты.Добавить(ФрагментМетки);
ФрагментГруппы = Новый ФрагментXS;
ФрагментГруппы.МинимальноВходит = 1;
ФрагментГруппы.МаксимальноВходит = 1;
ФрагментГруппы.Часть = Группа;
НоваяВалюта = Новый ОбъявлениеАтрибутаXS;
НоваяВалюта.Имя = "currency";
НоваяВалюта.ИмяТипа = Новый РасширенноеИмяXML("http://www.w3.org/2001/XMLSchema", "string");
НоваяВалюта.Форма = ФормаПредставленияXS.Неквалифицированная;
ИспользованиеВалюты = Новый ИспользованиеАтрибутаXS;
ИспользованиеВалюты.ОбъявлениеАтрибута = НоваяВалюта;
ИспользованиеВалюты.Использование = КатегорияИспользованияАтрибутаXS.НеОбязательно;
ИспользованиеВалюты.Ограничение = ОграничениеЗначенияXS.Фиксированное;
ИспользованиеВалюты.ЛексическоеЗначение = "RUB";
НовыйТип = Новый ОпределениеСоставногоТипаXS;
НовыйТип.МодельСодержимого = МодельСодержимогоXS.Составная;
НовыйТип.Содержимое = ФрагментГруппы;
НовыйТип.Атрибуты.Добавить(ИспользованиеВалюты);
НовыйКорень = Новый ОбъявлениеЭлементаXS;
НовыйКорень.Имя = "preview";
НовыйКорень.АнонимноеОпределениеТипа = НовыйТип;
Схема.Содержимое.Добавить(НовыйКорень);
Схема.ОбновитьЭлементDOM();
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Составная собственная XSD не прошла проверку";
КонецЕсли;
Сообщить(НовыйКорень.АнонимноеОпределениеТипа = НовыйТип);
Сообщить(НовыйКорень.Содержит(НовыйТип));
Сообщить(НовыйТип.Содержит(ФрагментГруппы));
Сообщить(Группа.Содержит(ФрагментМетки));
Сообщить(ФрагментМетки.Содержит(НоваяМетка));
Сообщить(Группа.Фрагменты.Количество() = 1);
Сообщить(НовыйТип.Атрибуты.Количество() = 1);
Сообщить(Не НоваяМетка.ЭтоГлобальноеОбъявление);
Сообщить(Не НоваяВалюта.ЭтоГлобальноеОбъявление);
Сообщить(ИспользованиеВалюты.ЛексическоеЗначение = "RUB");
Сообщить(Схема.ОбъявленияЭлементов.Количество() = 3);КонецПроцедуры
Функция ПрочитатьСвоюСхему(ТекстXSD)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXSD);
Попытка
ПостроительДерева = Новый ПостроительDOM;
ДокументСхемы = ПостроительДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
ПостроительСхем = Новый ПостроительСхемXML;
Результат = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Результат = Неопределено Тогда
ВызватьИсключение "Не построена собственная схема";
КонецЕсли;
Возврат Результат;
КонецФункцииРазбор по шагам
ОбъявлениеЭлементаXS label содержит QName xs:string и квалифицированную локальную форму.
ФрагментМетки задаёт обязательность 1..1 и ссылается на label через Часть.
ГруппаМоделиXS с видом Последовательность получает этот фрагмент. Второй ФрагментXS оборачивает саму группу.
ИспользованиеАтрибутаXS хранит локальное объявление currency, необязательное использование и fixed RUB.
ОпределениеСоставногоТипаXS имеет составную модель, Содержимое ссылается на фрагмент группы, Атрибуты содержит использование.
Глобальный preview получает АнонимноеОпределениеТипа и присоединяется к собственной Содержимое схемы. После синхронизации выполняется проверка.
Как проверить результат
Если построение проходит, одиннадцать сообщений Истина; глобальных элементов 3.
Экземпляр preview с label=Книга и currency=RUB допустим; отсутствие label, другая currency или лишний локальный элемент недопустимы в отдельной проверке XML.
Ожидаемый результат
Создана целая собственная составная модель, а не отдельно неприкреплённый объект конструктора.
На что обратить внимание
Имя анонимного типа не используется как глобальный QName.
Объявление атрибута и его использование — разные объекты.
Числа МинимальноВходит и МаксимальноВходит ограничивают XML-структуру, не количество товара в базе.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.