Альтернативные способы работы с XML. Часть 3: Введение в XSL-преобразования или трансформация XML

10.08.12

Разработка - Математика и алгоритмы

В современном IT мире XML является универсальным средством хранения и доставки информации. Он широко используется как в настольных приложениях, так и при веб-разработке, поддерживая парадигму MVC (model-view-controller), которая означает использование разделения логики работы с данными, пользовательского интерфейса и их взаимодействия при создании приложений. Т.о. XML с точки зрения MVC является одним из вариантов обеспечения функции взаимодействия между данными и пользовательским интерфейсом.

В современном IT мире XML является универсальным средством хранения и доставки информации. Он широко используется как в настольных приложениях, так и при веб-разработке, поддерживая парадигму MVC (model-view-controller), которая означает использование разделения логики работы с данными, пользовательского интерфейса и их взаимодействия при создании приложений. Т.о. XML с точки зрения MVC является одним из вариантов обеспечения функции взаимодействия между данными и пользовательским интерфейсом.

Особенно отчетливо это прослеживается в веб-приложениях, когда серверная процедура, обрабатывая некую бизнес-логику (данные), отдает другой серверной процедуре (или клиенту) результат в виде XML. Эта процедура в свою очередь получает XML, разбирает его по определенным правилам и формирует готовый HTML-код веб-страницы, для отображения пользователю. Такой подход значительно упрощает поддержку подобных приложений, особенно если проект сложный. Он позволяет разным специалистам сосредотачиваться только на своих зонах ответственности: программисты отвечают за обработку данных и выдачу результата, верстальщики эти данные визуализируют.

Разбирать XML по определенным правилам можно с помощью серверного языка программирования, а можно сделать трансформацию при помощи шаблонов XSL и получить на выходе готовый результат. Выходным результатом может быть не только веб-страница на языке HTML, при помощи XSL данные одного XML-файла можно переложить (трансформировать) в другой, с совершенно другой структурой. Нас с вами интересует именно последний вариант, поскольку 1С не предназначена для написания веб-приложений.

Как правило на практике разработчики 1С не сталкиваются с применением этой технологии. В принципе, это оправданно, ведь для решения повседневных задач клиентов достаточно использования последовательного построчного чтения XML с помощью объекта ЧтениеXML. Но всегда бывает полезно знать чуть больше. Цель статьи - познакомить незнакомых с технологией XSL преобразований 1С-ников. Как эту технологию применять на практике - тут каждый решит сам.

В качестве примера могу привести собственную разработку Анализатор мобильной связи. В программе есть модуль загрузчиков файлов с детализацией разговоров разных операторов сотовой связи. Порой приходится иметь дело с самыми запутанными XML-файлами. Разбирать такие файлы последовательным чтением довольно трудоемко, поэтому для таких случаев я применяю либо технологию xPath (специальный язык запросов к XML) для разбора файла либо трансформирую исходный XML при помощи преобразований XSL в удобный для последовательного чтения XML. Первый вариант описан в предыдущей публикации Введение в xPath или запросы к XML, а о вторым речь пойдет дальше. Оба варианта базируются на объектной модели документа DOM. Если вы еще не знакомы с этим понятием, то можете прочитать статью Введение в DOM или объектная модель документа XML.

Для преобразований XSL в 1С есть специальный объект ПреобразованиеXSL (процессор преобразования). На вход этому объекту подается исходный XML и шаблон-правило преобразования. По сути шаблон-правило это тоже XML с набором инструкций процессору преобразования. Говоря простым языком, эти инструкции определяют, какие данные и откуда нужно взять из исходного файла и как их структурировать в результирующем файле.

Пример работы с преобразованием показан ниже.

Код 1с для преобразования xml

Все, что начинается с "xsl:" - это инструкции процессору преобразования. Остальное включается в результирующий файл как есть.

Разберем инструкции и теги по порядку (отмечены красными цифрами):

  1. Это стандартная инструкция, обязательная для шаблона. Она задает относительный путь (ветку тегов) к которому будут применяться другие инструкции. В нашем случае - это корень (самый верхний тег) исходного файла xml.
  2. Определяется верхний тег phones для результирующего xml.
  3. Задается поиск цепочки тегов Array-Bill > bill > subs (логически это означет найти детальную информацию всех телефонных номеров) относительно корня исходного файла XML. Таких цепочек может быть множество. Поэтому инструкция for-each задает их циклический обход.
  4. При обходе каждой найденной в п.3 цепочки в результирующем XML внутри тега phones будет создаваться тег phone. Инструкция attribute name="id" привязывает к тегу phone атрибут id. Значение атрибута определяется следующей инструкцией value-of select="msisdn", которая определяет, что нужно внутри полученной цепочки Array-Bill > bill > subs найти тег msisdn (логически - это номер телефона) и подстваить его значение.
  5. Инструкиция copy-of select="s_det/crg/*" определяет, что внутри полученной цепочки Array-Bill > bill > subs необходимо найти цепочку тегов s_det > crg (логически эта цепочка ведет к расходам по конкретному телефонному номеру) и все теги внутри этой цепочки скопировать как есть в результирующий xml внутрь созданного в п.4 тега phone.
Теперь давайте разберем на простом тестовом примере возможности преобразования. В реальной жизни XML может быть гораздо более сложной структуры.
 
Подав на вход вышеописанного преобразователя XML следующего содержания:
 
xml источник
 
и применив описанный шаблон, в результирующем XML получим:
 
результирующий xml
 
Т.о. в результирующем XML отсутствуют ненужные для разбора теги, остались только те, которые имеют для нас значение. Структура тегов стала более удобной для последовательного чтения и разбора.

См. также

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 руб.

12.06.2017    138319    764    292    

405

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.230.x) и БП 3.0 (3.0.156.x). Правила подходят для версии ПРОФ и КОРП.

28000 руб.

15.12.2021    21912    144    40    

104

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

45650 руб.

15.04.2019    70482    174    146    

117

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 Бухгалтерский учет Управленческий учет Платные (руб)

Переход и перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:ERP Управление предприятием 2.5 и 1С:Комплексную автоматизацию 2.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.227.x), ERP 2.5 (2.5.16.x), КА 2.5 (2.5.16.x) .

28000 руб.

24.06.2020    62449    51    27    

81

SALE! %

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос в продаже с 2015г., и мы постоянно работаем над его развитием. Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

45650 27000 руб.

24.04.2015    192605    143    241    

274

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

В продаже с 2015 года | Воспользовались более 287 предприятий! | Перенос данных из УПП 1.3 в БП 3.0 | из КА 1.1 в БП 3.0 | Переносятся документы, начальные остатки и вся справочная информация | Сэкономьте свое время - используйте готовое решение для перехода! | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

39500 руб.

25.02.2015    169822    294    253    

374

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Платформа 1C v8.2 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

14580 руб.

18.02.2016    184666    573    509    

516

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3.87.x и УТ 11.5.16.x

28000 руб.

23.07.2020    48536    208    64    

170
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. СергейКа 670 10.08.12 16:48 Сейчас в теме
Тема хорошая, интересная, полезная.
Но разбита на такие кусочки, что отбивает желание плюсовать.
2. Sherlock_kmw 28 10.08.12 17:16 Сейчас в теме
Мне же наоборот кусочки нравятся. набор маленьких статей, которые потом автор, возможно, упакует в один красивый файлик
sinichenko_alex; pvl_mksv; 1cspecialist; +3 Ответить
3. СергейКа 670 11.08.12 14:20 Сейчас в теме
(2) Вот файлик бы со всем этим в одном я бы скачал :)
Согласен с тем, что если информации много, то это не читабельно в одной статье. Но есть же пределы...
4. gaglo 13.08.12 11:43 Сейчас в теме
Тема интересная. Но поскольку описано уже два метода, хотелось бы иметь и рекомендации насчет применения - когда xPath? когда XSL? Хотя бы намёком. Уж если автор сам пишет, что применяет и то, и другое...
5. kapustinag 13.08.12 14:23 Сейчас в теме
Полезная информация, и спасибо за конкретный пример применения.
А то, что тема раскрыта в нескольких статьях - лично у меня никаких претензий. Вряд ли на такой разбивке можно золотые горы заработать, а тема структурирована хорошо.
К тому же это структурирует и последующую дискуссию - вместо обсуждения XML вообще будут обсуждения в соответствии с конкретными темами статей.
1cspecialist; +1 Ответить
6. Новенький_2209 13.08.12 21:05 Сейчас в теме
Тема крута и автор молоток. Имхо, нужно соблюдать некую грань между производительностью и легкостью модификации решения/времени затраченное на модификацию и разработку. В случае сабжа - простым вещам - да. Сложные - один раз сделал, залил в бетоне и забыл. Твой приемник - все сотрет и перепишет циклами, т.к. в нашей 1сной экосистеме пока это не прижилось на массовом уровне. Кроме того, естественно если база - клиент-серверная и XPATH и XSLT нужно юзать в непосредственно на сервере SQL, дергая хранимку, а уже резалт - передавать в 1С для анализа.И это еще +100500 гвоздей в крышку ящика того несчастного, кто будет это все дорабатывать.

R.I.P.

Сам юзал XSLT один раз в жизни, когда одно XML представление, нужно было модифицировать коренным образом в другое. Файло были по 70 метров в среднем. После меня, следующий прог - все стер и написал без XSLT и запросов. Многа-многа кода в регламентном задании ночью - зато он понимает как работает и смог убедить руководство, что мое решения - овнянское, а его - торт! Но правда у меня преобразование шло меньше минуты, а у него - ночью. А ночь - темная в средней полосе, спешить некуда особо :)
vdmkvrshn; veiuper; KAPACEB.AA; Новиков; khaoos; 1cspecialist; +6 Ответить
7. vdmkvrshn 14 19.04.17 11:35 Сейчас в теме
Я вообще фанат этой технологии!! :) С ее изучением я полюбил работать с XML. Писал на ней обмен между типовым решением центральной базы и мобильным приложением: никаких тонн кода - все просто и кратко. Другой программист пришел - смотрит на это, как на нечто магическое, но придерживается правила "работает - не трогай". Если что-надо допилить, обращаются ко мне))

Вообще, часто применяю это при загрузке данных с каких-то сайтов: одним действием выдергиваешь из входящей XML-ины нужный кусок и преобразовываешь его в сериализованный объект 1С - массив, структуру, таблицу значений. Потом десериализуешь тоже одним стандартным методом глобального контекста. И профит - работаешь уже со стандартной коллекцией 1С. Модифицировать и отлаживать в разы проще, чем запутанный клубок циклов и условий, который ломается при каждом незначительном изменении структуры входящего файла.
RonX01; A_Max; +2 Ответить
Оставьте свое сообщение