Тип: РасширенноеИмяXML. Содержит имя ссылочного ключа.
Полное описание, параметры и ограничения
ОпределениеОграниченияИдентичностиXS.ИмяСсылочногоКлюча (XSIdentityConstraintDefinition.ReferencedKeyName)
ОпределениеОграниченияИдентичностиXS (XSIdentityConstraintDefinition)
ИмяСсылочногоКлюча (ReferencedKeyName)
Доступен, начиная с версии 8.1.
Использование:
Чтение и запись.
Описание:
Тип: РасширенноеИмяXML.
Содержит имя ссылочного ключа.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Примечание:
Представляет свойство referenced key (http://www.w3.org/TR/xmlschema-1/#referenced_key) информационного пространства определения.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Разделить ключ, уникальность и ссылку на ключ в XSD
Три ограничения одной собственной схемы имеют разные категории. Ссылочный ключ CodeRef разрешается в объявленный CodeKey, а не в строку книги.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Запускайте каждый самостоятельный фрагмент на сервере учебной базы. Полная собственная XSD включена в начало кода. Дисковые файлы, сеть и рабочие документы не используются.
В схеме books содержит book и link. CodeKey описывает ключ book/@code, SupplierUnique — уникальность book/@supplier, CodeRef — ссылку link/@code на ключ книги.
Набор.Проверить проверяет саму схему, а не экземпляр XML с книгами. Эти уроки не выдают анализ схемы за проверку реального импортируемого документа.
XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:keys"" targetNamespace=""urn:guide:keys"" elementFormDefault=""qualified"">
| <xs:element name=""books""><xs:complexType><xs:sequence>
| <xs:element name=""book"" minOccurs=""0"" maxOccurs=""unbounded""><xs:complexType>
| <xs:attribute name=""code"" type=""xs:string"" use=""required""/>
| <xs:attribute name=""supplier"" type=""xs:string""/>
| </xs:complexType></xs:element>
| <xs:element name=""link"" minOccurs=""0"" maxOccurs=""unbounded""><xs:complexType>
| <xs:attribute name=""code"" type=""xs:string"" use=""required""/>
| </xs:complexType></xs:element>
| </xs:sequence></xs:complexType>
| <xs:key name=""CodeKey""><xs:selector xpath=""g:book""/><xs:field xpath=""@code""/></xs:key>
| <xs:unique name=""SupplierUnique""><xs:selector xpath=""g:book""/><xs:field xpath=""@supplier""/></xs:unique>
| <xs:keyref name=""CodeRef"" refer=""g:CodeKey""><xs:selector xpath=""g:link""/><xs:field xpath=""@code""/></xs:keyref>
| </xs:element>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
ПостроительDOM = Новый ПостроительDOM;
DOM = ПостроительDOM.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(DOM.ЭлементДокумента);
Если Схема = Неопределено Тогда
ВызватьИсключение "Не построена собственная схема ключей";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Собственная схема ключей не прошла проверку";
КонецЕсли;
Корень = Схема.ОбъявленияЭлементов.Получить("books", "urn:guide:keys");
Если Корень = Неопределено Тогда
ВызватьИсключение "Не найден собственный корень books";
КонецЕсли;
Ограничения = Корень.ОграниченияИдентичности;
Если Ограничения.Количество() <> 3 Тогда
ВызватьИсключение "Ожидались три собственных ограничения";
КонецЕсли;
Ключ = Неопределено;
Уникальность = Неопределено;
Ссылка = Неопределено;
Для Каждого Ограничение Из Ограничения Цикл
Если ТипЗнч(Ограничение) <> Тип("ОпределениеОграниченияИдентичностиXS") Тогда
ВызватьИсключение "Ожидалось определение собственного ограничения";
КонецЕсли;
Если Ограничение.Имя = "CodeKey" Тогда
Ключ = Ограничение;
ИначеЕсли Ограничение.Имя = "SupplierUnique" Тогда
Уникальность = Ограничение;
ИначеЕсли Ограничение.Имя = "CodeRef" Тогда
Ссылка = Ограничение;
КонецЕсли;
КонецЦикла;
Если Ключ = Неопределено Или Уникальность = Неопределено Или Ссылка = Неопределено Тогда
ВызватьИсключение "Не найдены все три собственных определения";
КонецЕсли;
Сообщить(Ключ.Категория = КатегорияОграниченияИдентичностиXS.Ключ);
Сообщить(Уникальность.Категория = КатегорияОграниченияИдентичностиXS.Уникальность);
Сообщить(Ссылка.Категория = КатегорияОграниченияИдентичностиXS.СсылкаНаКлюч);
Сообщить(Ключ.URIПространстваИмен = "urn:guide:keys");
ИмяКлюча = Ссылка.ИмяСсылочногоКлюча;
Сообщить(ИмяКлюча.ЛокальноеИмя = "CodeKey");
Сообщить(ИмяКлюча.URIПространстваИмен = "urn:guide:keys");
Разрешённый = Ссылка.СсылочныйКлюч;
Если Разрешённый = Неопределено Тогда
ВызватьИсключение "Не разрешилась собственная ссылка CodeRef";
КонецЕсли;
Сообщить(Разрешённый.Имя = "CodeKey");
Сообщить(Ключ.Контейнер = Корень);
Сообщить(Ключ.КорневойКонтейнер <> Неопределено);
Сообщить(Ключ.Схема.ПространствоИмен = "urn:guide:keys");
Сообщить(Ключ.Аннотация = Неопределено);
Сообщить("Тип компонента: " + Строка(Ключ.ТипКомпоненты));
Сообщить("Дочерних компонентов ключа: " + Строка(Ключ.Компоненты.Количество()));
Ключ.ОбновитьЭлементDOM();
Сообщить(Ключ.ЭлементDOM.ПолучитьАтрибут("name") = "CodeKey");Разбор по шагам
Три определения ищутся по имени в собственной коллекции корневого объявления. Их порядок не предполагается.
Категория показывает разные виды правил; одинаковый XPath селектора не делает категории одинаковыми.
ИмяСсылочногоКлюча — расширенное XML-имя: локальная часть CodeKey и URI, не префикс g как идентификатор.
СсылочныйКлюч возвращает определение ограничения. До чтения имени проверяется отсутствие.
Контейнер и Схема показывают принадлежность своему дереву. После ОбновитьЭлементDOM проверяем реальный XML-атрибут имени.
Как проверить результат
Двенадцать сравнений Истина и две диагностические строки.
CodeRef разрешён в CodeKey своей схемы, а не в произвольный ключ другой схемы.
Ожидаемый результат
Категории, расширенное имя и разрешённое определение связаны на полной собственной XSD.
На что обратить внимание
Этот фрагмент не проверяет существование конкретной книги с кодом A001.
Набор.Проверить не является проверкой XML-экземпляра на дубликаты или висячие ссылки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.