Часто при интеграции со сторонними системами возникает задача: есть исходный файл XML и шаблон XSLT, необходимо подать их на вход и получить на выходе трансформированный файл. Рассмотрим подробнее, как реализовать этот механизм в устаревшей, но все еще используемой платформе 1С 7.7.
Проанализируем ситуацию с базовыми возможностями платформы. В отличие от версий 8.х, где функционал присутствует "из коробки", платформа 1С 7.7 не содержит нативных встроенных инструментов для XSLT-преобразований.
Стандартная внешняя компонента для работы с XML — v7plus.dll — является лишь устаревшей оберткой над системным парсером. Мы не рекомендуем использовать ее для сложных задач трансформации, так как она:
Посмотрим на проверенные и надежные способы решения этой задачи.
Наиболее надежным способом сделать XSLT-преобразование непосредственно из кода 1С 7.7 является прямое обращение к библиотеке MSXML через механизм COM-объектов. Для этого мы будем использовать объект MSXML2.DOMDocument. Рекомендуется указывать точную версию, например MSXML2.DOMDocument.6.0 или MSXML2.DOMDocument.3.0.
Разберем по шагам логику работы этого метода:
MSXML2.DOMDocument.load() загружаем исходный XML-файл.load() загружаем наш XSLT-шаблон.transformNode(), передавая в качестве параметра второй объект (шаблон).Пример реализации в коде 1С 7.7:
XMLДок = СоздатьОбъект("MSXML2.DOMDocument.6.0");
XSLTДок = СоздатьОбъект("MSXML2.DOMDocument.6.0");
// Загружаем файлы
XMLДок.load(ПутьКФайлуXML);
XSLTДок.load(ПутьКФайлуXSLT);
// Выполняем трансформацию с возвратом результата в виде строки
РезультатСтрока = XMLДок.transformNode(XSLTДок);
Важно: Метод transformNode() возвращает готовый результат в виде текстовой строки. Однако существует также метод transformNodeToObject(). Он позволяет выгрузить результат преобразования не в строку, а напрямую в новый COM-объект или файл. Это поможет вам избавиться от потенциальных проблем с кодировками при сохранении текста средствами самой 1С 7.7.
Выясним причину, по которой первого способа может быть недостаточно. Библиотека MSXML поддерживает только стандарт XSLT 1.0. Если вам необходимо использовать более сложные и современные шаблоны (XSLT 2.0 или 3.0), следует применить консольные утилиты или классы .Net (как советовали на форуме, подключив соответствующую DLL).
Свободных XSLT-процессоров существует множество (например, легковесные утилиты msxsl.exe или xsltproc). Рассмотрим, как с ними взаимодействовать:
WScript.Shell из кода 1С 7.7 мы можем невидимо для пользователя запускать эти независимые обработчики.Частая проблема при трансформациях — наличие пространств имен (namespaces) в исходном файле XML. Если в XSLT-файле явно не прописана работа с этими пространствами, системный парсер просто не сможет найти нужные узлы, и на выходе вы получите пустой файл.
В качестве решения этой проблемы мы рекомендуем программно очищать исходный XML-документ от пространств имен перед основным преобразованием. Это можно сделать с помощью простейшего промежуточного XSLT-правила, удаляющего неймспейсы, и только после этого применять ваш основной XSLT-шаблон.