Определяет, содержит ли данный компонент указанный.
Синтаксис
Содержит(<Компонент>)Полное описание, параметры и ограничения
ИспользованиеАтрибутаXS.Содержит (XSAttributeUse.Contains)
ИспользованиеАтрибутаXS (XSAttributeUse)
Содержит (Contains)
Доступен, начиная с версии 8.1.
Синтаксис:
Содержит(<Компонент>)
Параметры:
<Компонент> (обязательный)
Тип: АннотацияXS, СхемаXML, ИнформацияДляПриложенияXS, ДокументацияXS, ФасетМинимальногоИсключающегоЗначенияXS, ФасетМинимальногоВключающегоЗначенияXS, ФасетМаксимальногоИсключающегоЗначенияXS, ФасетМаксимальногоВключающегоЗначенияXS, ФасетДлиныXS, ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS, ФасетОбщегоКоличестваРазрядовXS, ФасетКоличестваРазрядовДробнойЧастиXS, ФасетПеречисленияXS, ФасетОбразцаXS, ФасетПробельныхСимволовXS, ОпределениеПростогоТипаXS, ОпределениеСоставногоТипаXS, ОпределениеГруппыАтрибутовXS, ОпределениеГруппыМоделиXS, ОбъявлениеАтрибутаXS, ОбъявлениеЭлементаXS, ОпределениеОграниченияИдентичностиXS, ОпределенияXPathXS, ОбъявлениеНотацииXS, МаскаXS, ИмпортXS, ВключениеXS, ПереопределениеXS, ИспользованиеАтрибутаXS, ГруппаМоделиXS, Фрагмент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.
ЯвляетсяПодмножеством не вызывается: в локальной справке отсутствует параметр сравниваемого фрагмента, сигнатуру не угадываем.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Разрешить две ссылки из анонимного типа 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 не выдается за независимое копирование всех глобальных объявлений.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.