ПреобразованиеXSL.По умолчанию

Конструкторы

Синтаксис и применение ПреобразованиеXSL.По умолчанию в платформе 1С:Предприятие. Описание и примеры кода.

Синтаксис

Новый ПреобразованиеXSL
Полное описание, параметры и ограничения

ПреобразованиеXSL.По умолчанию

ПреобразованиеXSL (XSLTransform)

По умолчанию

Синтаксис:
Новый ПреобразованиеXSL
Методическая информация

Практические примеры

Преобразовать собственное XML DOM по собственному DOM стиля

ИзУзла принимает уже построенный узел. Сначала создаём оба дерева из своих коротких строк; не передаём случайный неизвестный узел.

Где и как запускать

Полный серверный общий модуль своей отдельной учебной конфигурации.

Подготовка

  1. В своей отдельной конфигурации УчебнаяКонфигурацияСинтаксиса создайте серверный общий модуль УчебныеПреобразованияXSL с флагом Сервер. Вставьте весь код выбранного урока.

  2. Из серверной команды своей обработки вызовите УчебныеПреобразованияXSL.ВыполнитьПример(). Все XML и XSL уже приведены полностью; файлы реальных обменов не нужны.

  3. Исходный XML содержит одну вымышленную Книгу: количество 3, цена 250, явно заданная сумма строки 750. XSL суммирует поле total и применяет учебный коэффициент; он не читает цены 1С.

  4. Стиль не содержит import/include, document(), скриптов, DTD или внешних источников. Не подставляйте неизвестный XSL: преобразование не является безопасным исполнителем произвольного внешнего кода.

  5. В первых трёх уроках всё в памяти. Последний создаёт только два собственных новых временных файла на стороне сервера и выводит пути; автоматически их не удаляет. Просмотрите и удалите только эти файлы вручную после опыта.

Процедура ВыполнитьПример() Экспорт
    Исходный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: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаЧтения;
    КонецПопытки;
    Чтение.Закрыть();
    Возврат Документ;
КонецФункции

Разбор по шагам

  1. Построить отдельные DOM стиля и данных полным приложенным помощником. Он закрывает XML-чтение.

  2. Передать корневой элемент своего стиля в ЗагрузитьТаблицуСтилейXSLИзУзла.

  3. Передать корневой order в ПреобразоватьИзУзла без писателя и получить результат-строку.

  4. Прочитать summary и проверить его атрибуты. Исходное дерево данных сохраняет свой корень order.

  5. ЛокальноеИмя stylesheet не включает префикс xsl, а ИмяУзла исходного order здесь не имеет префикса.

Как проверить результат

  1. Четыре логические проверки Истина: сумма 750, свой заголовок и два ожидаемых корня.

  2. Это новая результатная XML-модель, а не редактирование прежнего дерева order.

Ожидаемый результат

Новичок получает оба реальных узла и видит полный DOM-вариант преобразования.

На что обратить внимание

  1. ИзУзла — не парсер строк: сначала нужен узел DOM.

  2. Не полагайтесь на буквальный XML-префикс для установления пространства имён.

  3. Как и в строковом варианте, переданный писатель меняет способ получения результата; здесь он не передаётся.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Преобразовать XML через собственные объекты чтения и записи

Преобразовать читает источник и пишет результат в ЗаписьXML, не возвращает строку. Готовая строка получается при закрытии собственного писателя.

Где и как запускать

Полный серверный общий модуль своей отдельной учебной конфигурации.

Подготовка

  1. В своей отдельной конфигурации УчебнаяКонфигурацияСинтаксиса создайте серверный общий модуль УчебныеПреобразованияXSL с флагом Сервер. Вставьте весь код выбранного урока.

  2. Из серверной команды своей обработки вызовите УчебныеПреобразованияXSL.ВыполнитьПример(). Все XML и XSL уже приведены полностью; файлы реальных обменов не нужны.

  3. Исходный XML содержит одну вымышленную Книгу: количество 3, цена 250, явно заданная сумма строки 750. XSL суммирует поле total и применяет учебный коэффициент; он не читает цены 1С.

  4. Стиль не содержит import/include, document(), скриптов, DTD или внешних источников. Не подставляйте неизвестный XSL: преобразование не является безопасным исполнителем произвольного внешнего кода.

  5. В первых трёх уроках всё в памяти. Последний создаёт только два собственных новых временных файла на стороне сервера и выводит пути; автоматически их не удаляет. Просмотрите и удалите только эти файлы вручную после опыта.

Процедура ВыполнитьПример() Экспорт
    Исходный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Ресурсы(Ресурсы)
    Ошибки = Новый Массив;
    Для Каждого Ресурс Из Ресурсы Цикл
        Попытка
            Ресурс.Закрыть();
        Исключение
            Ошибки.Добавить(ОписаниеОшибки());
        КонецПопытки;
    КонецЦикла;
    Возврат СтрСоединить(Ошибки, Символы.ПС);
КонецФункции

Разбор по шагам

  1. Создать отдельное ЧтениеXML для своего стиля. После загрузки стиля закрыть его: исходный XML читается другим объектом.

  2. Создать ЧтениеXML данных и ЗаписьXML с выходом в память. Вызвать Преобразовать без присваивания возвращаемого значения.

  3. При ошибке преобразования попытаться закрыть оба своих ресурса, сохранить исходную ошибку и ошибки закрытия.

  4. При успехе закрыть чтение и получить строку из Запись.Закрыть. Не закрывать писателя до преобразования.

  5. Прочитать итоговый XML своим DOM-помощником и проверить сумму и заголовок.

Как проверить результат

  1. Обе итоговые проверки Истина: amount 750 и caption Учебная Книга.

  2. Все читатели и писатель закрываются. Нет чтения файла или передачи результата по сети.

Ожидаемый результат

Показан законченный потоковый вариант с правильной точкой получения результата.

На что обратить внимание

  1. Не пишите Результат = Преобразование.Преобразовать(...): этот вариант пишет в переданный объект.

  2. ЧтениеСтиля и ЧтениеДанных — два разных ресурса с разными источниками.

  3. При ошибке закрытия не выдавайте текст результата за успешный завершённый обмен.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.