Определяет, является ли данная маска подмножеством указанной. Используется алгоритм, описанный в http://www.w3.org/TR/xmlschema-1/#cos-ns-subset.
Синтаксис
ЭтаМаскаПодмножество(<Маска>)Полное описание, параметры и ограничения
МаскаXS.ЭтаМаскаПодмножество (XSWildcard.IsWildcardSubset)
МаскаXS (XSWildcard)
ЭтаМаскаПодмножество (IsWildcardSubset)
Доступен, начиная с версии 8.1.
Синтаксис:
ЭтаМаскаПодмножество(<Маска>)
Параметры:
<Маска> (обязательный)
Тип: МаскаXS.
Маска - предполагаемое подмножество.
Возвращаемое значение:
Тип: Булево.
Описание:
Определяет, является ли данная маска подмножеством указанной.
Используется алгоритм, описанный в http://www.w3.org/TR/xmlschema-1/#cos-ns-subset.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Сравнить узкую и широкую маски по направлению подмножества
Новая отдельная маска partner является подмножеством списка partner/labels. Обратное включение неверно.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Фрагменты запускайте по отдельности на сервере учебной базы. Полная собственная XSD Envelope включена в код, внешние данные и схемы не загружаются.
Маска элементов разрешает только два собственных URN, маска атрибутов один. lax и skip — способы обработки содержимого XSD, а не отключение безопасного XML-парсинга.
Набор.Проверить проверяет структуру XSD. Примеры не заявляют, что проверен XML-экземпляр с неизвестными элементами.
XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:envelope"" targetNamespace=""urn:guide:envelope"" elementFormDefault=""qualified"">
| <xs:complexType name=""Envelope""><xs:sequence>
| <xs:any namespace=""urn:guide:partner urn:guide:labels"" processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/>
| </xs:sequence><xs:anyAttribute namespace=""urn:guide:partner"" processContents=""skip""/></xs:complexType>
| <xs:element name=""envelope"" type=""g:Envelope""/>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
ЧтениеДерева = Новый ПостроительDOM;
ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
ТипКонверта = Схема.ОпределенияТипов.Получить("Envelope", "urn:guide:envelope");
Если ТипЗнч(ТипКонверта) <> Тип("ОпределениеСоставногоТипаXS") Тогда
ВызватьИсключение "Не получен собственный составной тип Envelope";
КонецЕсли;
Фрагмент = ТипКонверта.Содержимое;
Если ТипЗнч(Фрагмент) <> Тип("ФрагментXS") Тогда
ВызватьИсключение "Ожидалась собственная модель sequence";
КонецЕсли;
Группа = Фрагмент.Часть;
Если ТипЗнч(Группа) <> Тип("ГруппаМоделиXS") Тогда
ВызватьИсключение "Нет модели собственного конверта";
КонецЕсли;
Если Группа.Фрагменты.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный xs:any";
КонецЕсли;
МаскаЭлементов = Группа.Фрагменты.Получить(0).Часть;
МаскаАтрибутов = ТипКонверта.МаскаАтрибутов;
Если ТипЗнч(МаскаЭлементов) <> Тип("МаскаXS") Или ТипЗнч(МаскаАтрибутов) <> Тип("МаскаXS") Тогда
ВызватьИсключение "Не получены собственные маски элементов и атрибутов";
КонецЕсли;
Узкая = Новый МаскаXS;
Узкая.ЛексическоеЗначениеОграниченияПространствИмен = "urn:guide:partner";
Узкая.ВидОбработкиСодержимого = ОбработкаСодержимогоXS.Слабая;
Сообщить(Узкая.Допускает("urn:guide:partner"));
Сообщить(Не Узкая.Допускает("urn:guide:labels"));
Сообщить(Узкая.ЭтаМаскаПодмножество(МаскаЭлементов));
Сообщить(Не МаскаЭлементов.ЭтаМаскаПодмножество(Узкая));
Сообщить(Узкая.ЭтаМаскаПодмножество(Узкая));
Сообщить(Узкая.ОграничениеПространствИмен().Количество() = 1);Разбор по шагам
Конструктор создаёт новую маску, не присоединяет её к Envelope.
Задаём явный URI partner без специальных ##targetNamespace, чтобы не зависеть от отсутствующего контейнера новой маски.
Узкая.ЭтаМаскаПодмножество(Широкая) проверяет направление от текущего объекта к переданному.
Обратное направление Ложь: широкая разрешает labels, узкая не разрешает.
Маска является подмножеством самой себя. Это отношения пространств имён, не сравнение количества книг или прав доступа.
Как проверить результат
Шесть сообщений Истина.
Явно показано направление подмножества и отсутствие второго разрешённого URI.
Ожидаемый результат
Новая маска использована для настоящего сравнения правил namespace.
На что обратить внимание
Не меняйте направление вызова местами.
Сравнение пространств имён не проверяет данные XML-экземпляра.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.