Синтаксис и применение ПреобразованиеXSL.По умолчанию в платформе 1С:Предприятие. Описание и примеры кода.
Синтаксис
Новый ПреобразованиеXSLПолное описание, параметры и ограничения
ПреобразованиеXSL.По умолчанию
ПреобразованиеXSL (XSLTransform)
По умолчанию
Синтаксис:
Новый ПреобразованиеXSL
Методическая информация
Практические примеры
Преобразовать собственное XML DOM по собственному DOM стиля
ИзУзла принимает уже построенный узел. Сначала создаём оба дерева из своих коротких строк; не передаём случайный неизвестный узел.
Где и как запускать
Полный серверный общий модуль своей отдельной учебной конфигурации.
Подготовка
В своей отдельной конфигурации УчебнаяКонфигурацияСинтаксиса создайте серверный общий модуль УчебныеПреобразованияXSL с флагом Сервер. Вставьте весь код выбранного урока.
Из серверной команды своей обработки вызовите УчебныеПреобразованияXSL.ВыполнитьПример(). Все XML и XSL уже приведены полностью; файлы реальных обменов не нужны.
Исходный XML содержит одну вымышленную Книгу: количество 3, цена 250, явно заданная сумма строки 750. XSL суммирует поле total и применяет учебный коэффициент; он не читает цены 1С.
Стиль не содержит import/include, document(), скриптов, DTD или внешних источников. Не подставляйте неизвестный XSL: преобразование не является безопасным исполнителем произвольного внешнего кода.
В первых трёх уроках всё в памяти. Последний создаёт только два собственных новых временных файла на стороне сервера и выводит пути; автоматически их не удаляет. Просмотрите и удалите только эти файлы вручную после опыта.
Процедура ВыполнитьПример() Экспорт
ИсходныйXML = "<order><line name=""Книга"" quantity=""3"" price=""250"" total=""750""/></order>";
Стиль = "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:g=""urn:guide:xsl-params"" exclude-result-prefixes=""g"">
|<xsl:output method=""xml"" omit-xml-declaration=""yes""/>
|<xsl:param name=""multiplier"" select=""1""/><xsl:param name=""g:caption"" select=""'Учебная Книга'""/>
|<xsl:template match=""/""><summary caption=""{$g:caption}"" amount=""{format-number(sum(order/line/@total) * $multiplier, '0')}""/></xsl:template>
|</xsl:stylesheet>";
DOMСтиля = ПолучитьСвойXMLDOM(Стиль);
DOMДанных = ПолучитьСвойXMLDOM(ИсходныйXML);
Преобразование = Новый ПреобразованиеXSL;
Преобразование.ЗагрузитьТаблицуСтилейXSLИзУзла(DOMСтиля.ЭлементДокумента);
РезультатXML = Преобразование.ПреобразоватьИзУзла(DOMДанных.ЭлементДокумента);
DOMРезультата = ПолучитьСвойXMLDOM(РезультатXML);
Сообщить(DOMРезультата.ЭлементДокумента.ПолучитьАтрибут("amount") = "750");
Сообщить(DOMРезультата.ЭлементДокумента.ПолучитьАтрибут("caption") = "Учебная Книга");
Сообщить(DOMДанных.ЭлементДокумента.ИмяУзла = "order");
Сообщить(DOMСтиля.ЭлементДокумента.ЛокальноеИмя = "stylesheet");
КонецПроцедуры
Функция ПолучитьСвойXMLDOM(ТекстXML)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXML);
Попытка
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение);
Исключение
ОшибкаЧтения = ОписаниеОшибки();
Попытка
Чтение.Закрыть();
Исключение
ВызватьИсключение ОшибкаЧтения + Символы.ПС + "Закрытие XML: " + ОписаниеОшибки();
КонецПопытки;
ВызватьИсключение ОшибкаЧтения;
КонецПопытки;
Чтение.Закрыть();
Возврат Документ;
КонецФункцииРазбор по шагам
Построить отдельные DOM стиля и данных полным приложенным помощником. Он закрывает XML-чтение.
Передать корневой элемент своего стиля в ЗагрузитьТаблицуСтилейXSLИзУзла.
Передать корневой order в ПреобразоватьИзУзла без писателя и получить результат-строку.
Прочитать summary и проверить его атрибуты. Исходное дерево данных сохраняет свой корень order.
ЛокальноеИмя stylesheet не включает префикс xsl, а ИмяУзла исходного order здесь не имеет префикса.
Как проверить результат
Четыре логические проверки Истина: сумма 750, свой заголовок и два ожидаемых корня.
Это новая результатная XML-модель, а не редактирование прежнего дерева order.
Ожидаемый результат
Новичок получает оба реальных узла и видит полный DOM-вариант преобразования.
На что обратить внимание
ИзУзла — не парсер строк: сначала нужен узел DOM.
Не полагайтесь на буквальный XML-префикс для установления пространства имён.
Как и в строковом варианте, переданный писатель меняет способ получения результата; здесь он не передаётся.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Преобразовать XML через собственные объекты чтения и записи
Преобразовать читает источник и пишет результат в ЗаписьXML, не возвращает строку. Готовая строка получается при закрытии собственного писателя.
Где и как запускать
Полный серверный общий модуль своей отдельной учебной конфигурации.
Подготовка
В своей отдельной конфигурации УчебнаяКонфигурацияСинтаксиса создайте серверный общий модуль УчебныеПреобразованияXSL с флагом Сервер. Вставьте весь код выбранного урока.
Из серверной команды своей обработки вызовите УчебныеПреобразованияXSL.ВыполнитьПример(). Все XML и XSL уже приведены полностью; файлы реальных обменов не нужны.
Исходный XML содержит одну вымышленную Книгу: количество 3, цена 250, явно заданная сумма строки 750. XSL суммирует поле total и применяет учебный коэффициент; он не читает цены 1С.
Стиль не содержит import/include, document(), скриптов, DTD или внешних источников. Не подставляйте неизвестный XSL: преобразование не является безопасным исполнителем произвольного внешнего кода.
В первых трёх уроках всё в памяти. Последний создаёт только два собственных новых временных файла на стороне сервера и выводит пути; автоматически их не удаляет. Просмотрите и удалите только эти файлы вручную после опыта.
Процедура ВыполнитьПример() Экспорт
ИсходныйXML = "<order><line name=""Книга"" quantity=""3"" price=""250"" total=""750""/></order>";
Стиль = "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:g=""urn:guide:xsl-params"" exclude-result-prefixes=""g"">
|<xsl:output method=""xml"" omit-xml-declaration=""yes""/>
|<xsl:param name=""multiplier"" select=""1""/><xsl:param name=""g:caption"" select=""'Учебная Книга'""/>
|<xsl:template match=""/""><summary caption=""{$g:caption}"" amount=""{format-number(sum(order/line/@total) * $multiplier, '0')}""/></xsl:template>
|</xsl:stylesheet>";
Преобразование = Новый ПреобразованиеXSL;
ЧтениеСтиля = Новый ЧтениеXML;
ЧтениеСтиля.УстановитьСтроку(Стиль);
Попытка
Преобразование.ЗагрузитьТаблицуСтилейXSL(ЧтениеСтиля);
Исключение
ОшибкаСтиля = ОписаниеОшибки();
Ресурсы = Новый Массив;
Ресурсы.Добавить(ЧтениеСтиля);
ОшибкиЗакрытия = ЗакрытьСвоиXMLРесурсы(Ресурсы);
ВызватьИсключение ОшибкаСтиля + Символы.ПС + ОшибкиЗакрытия;
КонецПопытки;
ЧтениеСтиля.Закрыть();
ЧтениеДанных = Новый ЧтениеXML;
ЧтениеДанных.УстановитьСтроку(ИсходныйXML);
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Попытка
Преобразование.Преобразовать(ЧтениеДанных, Запись);
Исключение
ОшибкаПреобразования = ОписаниеОшибки();
Ресурсы = Новый Массив;
Ресурсы.Добавить(ЧтениеДанных);
Ресурсы.Добавить(Запись);
ОшибкиЗакрытия = ЗакрытьСвоиXMLРесурсы(Ресурсы);
ВызватьИсключение ОшибкаПреобразования + Символы.ПС + ОшибкиЗакрытия;
КонецПопытки;
Попытка
ЧтениеДанных.Закрыть();
Исключение
ОшибкаЗакрытияЧтения = ОписаниеОшибки();
Попытка
Запись.Закрыть();
Исключение
ВызватьИсключение ОшибкаЗакрытияЧтения + Символы.ПС + ОписаниеОшибки();
КонецПопытки;
ВызватьИсключение ОшибкаЗакрытияЧтения;
КонецПопытки;
РезультатXML = Запись.Закрыть();
ДокументРезультата = ПолучитьСвойXMLDOM(РезультатXML);
Сообщить(ДокументРезультата.ЭлементДокумента.ПолучитьАтрибут("amount") = "750");
Сообщить(ДокументРезультата.ЭлементДокумента.ПолучитьАтрибут("caption") = "Учебная Книга");
КонецПроцедуры
Функция ПолучитьСвойXMLDOM(ТекстXML)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXML);
Попытка
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение);
Исключение
ОшибкаЧтения = ОписаниеОшибки();
Попытка
Чтение.Закрыть();
Исключение
ВызватьИсключение ОшибкаЧтения + Символы.ПС + "Закрытие XML: " + ОписаниеОшибки();
КонецПопытки;
ВызватьИсключение ОшибкаЧтения;
КонецПопытки;
Чтение.Закрыть();
Возврат Документ;
КонецФункции
Функция ЗакрытьСвоиXMLРесурсы(Ресурсы)
Ошибки = Новый Массив;
Для Каждого Ресурс Из Ресурсы Цикл
Попытка
Ресурс.Закрыть();
Исключение
Ошибки.Добавить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Возврат СтрСоединить(Ошибки, Символы.ПС);
КонецФункцииРазбор по шагам
Создать отдельное ЧтениеXML для своего стиля. После загрузки стиля закрыть его: исходный XML читается другим объектом.
Создать ЧтениеXML данных и ЗаписьXML с выходом в память. Вызвать Преобразовать без присваивания возвращаемого значения.
При ошибке преобразования попытаться закрыть оба своих ресурса, сохранить исходную ошибку и ошибки закрытия.
При успехе закрыть чтение и получить строку из Запись.Закрыть. Не закрывать писателя до преобразования.
Прочитать итоговый XML своим DOM-помощником и проверить сумму и заголовок.
Как проверить результат
Обе итоговые проверки Истина: amount 750 и caption Учебная Книга.
Все читатели и писатель закрываются. Нет чтения файла или передачи результата по сети.
Ожидаемый результат
Показан законченный потоковый вариант с правильной точкой получения результата.
На что обратить внимание
Не пишите Результат = Преобразование.Преобразовать(...): этот вариант пишет в переданный объект.
ЧтениеСтиля и ЧтениеДанных — два разных ресурса с разными источниками.
При ошибке закрытия не выдавайте текст результата за успешный завершённый обмен.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.