gifts2017

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

Опубликовал Денис (1cspecialist) в раздел Программирование - Теория программирования

В современном 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 отсутствуют ненужные для разбора теги, остались только те, которые имеют для нас значение. Структура тегов стала более удобной для последовательного чтения и разбора.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сергей Кучеров (СергейКа) 10.08.12 16:48
Тема хорошая, интересная, полезная.
Но разбита на такие кусочки, что отбивает желание плюсовать.
2. Юрий Курсин (Sherlock_kmw) 10.08.12 17:16
Мне же наоборот кусочки нравятся. набор маленьких статей, которые потом автор, возможно, упакует в один красивый файлик
1cspecialist; +1 Ответить 1
3. Сергей Кучеров (СергейКа) 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 и запросов. Многа-многа кода в регламентном задании ночью - зато он понимает как работает и смог убедить руководство, что мое решения - овнянское, а его - торт! Но правда у меня преобразование шло меньше минуты, а у него - ночью. А ночь - темная в средней полосе, спешить некуда особо :)
veiuper; KAPACEB.AA; Новиков; khaoos; 1cspecialist; +5 Ответить