Преобразовать свою Книгу и изменить параметры XSL без изменения 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;
    Преобразование.ЗагрузитьТаблицуСтилейXSLИзСтроки(Стиль);
    Преобразование.ДобавитьПараметр("multiplier", 2);
    Преобразование.ДобавитьПараметр("caption", "urn:guide:xsl-params", "Свой учебный расчёт");
    ПервыйXML = Преобразование.ПреобразоватьИзСтроки(ИсходныйXML);
    ПервыйDOM = ПолучитьСвойXMLDOM(ПервыйXML);
    Сообщить(ПервыйDOM.ЭлементДокумента.ПолучитьАтрибут("amount") = "1500");
    Сообщить(ПервыйDOM.ЭлементДокумента.ПолучитьАтрибут("caption") = "Свой учебный расчёт");
    Преобразование.ДобавитьПараметр("multiplier", 3);
    ВторойXML = Преобразование.ПреобразоватьИзСтроки(ИсходныйXML);
    ВторойDOM = ПолучитьСвойXMLDOM(ВторойXML);
    Сообщить(ВторойDOM.ЭлементДокумента.ПолучитьАтрибут("amount") = "2250");
    Преобразование.УдалитьПараметр("multiplier");
    Преобразование.УдалитьПараметр("caption", "urn:guide:xsl-params");
    БезПараметров = ПолучитьСвойXMLDOM(Преобразование.ПреобразоватьИзСтроки(ИсходныйXML));
    Сообщить(БезПараметров.ЭлементДокумента.ПолучитьАтрибут("amount") = "750");
    Сообщить(БезПараметров.ЭлементДокумента.ПолучитьАтрибут("caption") = "Учебная Книга");
    Преобразование.Очистить();
    Преобразование.ЗагрузитьТаблицуСтилейXSLИзСтроки(Стиль);
    ПослеОчистки = ПолучитьСвойXMLDOM(Преобразование.ПреобразоватьИзСтроки(ИсходныйXML));
    Сообщить(ПослеОчистки.ЭлементДокумента.ПолучитьАтрибут("amount") = "750");
    Сообщить(СтрНайти(ИсходныйXML, "total=""750""") > 0);
КонецПроцедуры

Функция ПолучитьСвойXMLDOM(ТекстXML)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(ТекстXML);
    Попытка
        Построитель = Новый ПостроительDOM;
        Документ = Построитель.Прочитать(Чтение);
    Исключение
        ОшибкаЧтения = ОписаниеОшибки();
        Попытка
            Чтение.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаЧтения + Символы.ПС + "Закрытие XML: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаЧтения;
    КонецПопытки;
    Чтение.Закрыть();
    Возврат Документ;
КонецФункции

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

  1. Загрузить полный собственный стиль из строки. У него коэффициент по умолчанию 1 и заголовок Учебная Книга.

  2. Добавить обычный числовой параметр multiplier=2 и namespaced-параметр caption отдельными локальным именем и URI.

  3. Преобразовать исходную строку без писателя: результат — строка XML. Прочитать её DOM и проверить атрибуты 1500 и собственного заголовка.

  4. Повторно задать multiplier=3: значение переопределяется, результат 2250, исходный XML остаётся с total=750.

  5. Удалить оба параметра двумя соответствующими вариантами API. Результат снова использует значения стиля по умолчанию.

  6. Очистить внутреннее состояние и явно загрузить стиль заново перед следующей операцией. Не считать Очистить заменой закрытия XML-ресурсов.

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

  1. Семь булевых сообщений Истина: 1500, 2250, затем дважды 750; исходные данные не изменились.

  2. Префикс g принадлежит стилю, URI идентифицирует параметр. Это не сетевой адрес.

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

Получен полный опыт параметров, их удаления, сброса и повторной подготовки на одном XML.

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

  1. Число 2 — учебный коэффициент преобразования, не изменение количества товара и не валютный курс.

  2. Передавать только строковые/числовые/булевы параметры; XDTO-объект сюда не подставляется.

  3. При наличии второго аргумента-писателя у ПреобразоватьИзСтроки результата-строки нет. Здесь писателя намеренно нет.

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

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

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

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

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