Xml и xslt в примерах для начинающих


Содержание

Xml и xslt в примерах для начинающих

Прохаживаясь по страницам нашего форума и отвечая на вопросы я пришел к выводу, что большинство спрашивающих посетителей в основных чертах знают основы применения XSLT преобразования, но на практике сталкиваются с рядом вопросов — а как же это использовать?

Про XSLT-преобразование написано много статей, и мне не хотелось бы повторяться и пересказывать теорию XSLT. В данной статье речь пойдет о некоторых приемах и хитростях XSLT-разработчика. На такое громкое название, как CookBook (книга рецептов), статья не претендует, но парой хитростей я поделюсь. Статья рассчитана на начинающих пользователей XSLT-шаблонизации, знающих хотя бы ее основы.

Начнем с азов.

Получение выходного HTML-кода получается путем преобразования XSLT-процессором входных XML-данных по XSL-шаблону. Соответственно, умение организовать правильный выходной поток, т.е. наш HTML-код, состоит из умения правильно организовать XML-данные и умения правильно писать шаблоны. (Хотелось бы отметить, что использование XSLT-преобразования не ограничивается генерацией только выходного HTML-кода).

Отсюда напрашивается вывод, что, прежде чем искать ошибку в шаблонах, надо проверить сами XML-данные, т.е. их структуру и состав. Проверка организуется двумя способами: либо выводом в лог-файл, либо выводом XML-данных вместо результата XSLT-процессора.

Если мы используем второй способ (вывод в браузер), то, чтобы эти данные опознал браузер как XML поток и представил в удобопонимаемом виде, необходимо выдать заголовок Content-type: text/xml:

Необходимо отметить, что когда пишется XSL-шаблон, то это уже не HTML, а XML, и надо руководствоваться правилами валидности XML:

  • Каждому открывающему тегу должен соответствовать закрывающий тег. Это в основном касается парности таких тегов, как
    , .
  • Если тег представлен без пары (одинарный), то он должен иметь закрывающий слэш. Это в основном касается таких одинарных тегов, как
    и .
  • Практически это означает, что нельзя перемешивать теги, должна быть четкая иерархия вложенности. Например, такие конструкции как: bla-bla-bla bla-bla-bla bla-bla-bla валидны в HTML, но недопустимы в XML.

    Использование включений

    Вот уже готово Ваше преобразование, осталось только придать внешний вид сгенерированной странице. Нет проблем, когда страница одна или две. Проблемы появляются, когда их больше десятка и весь сайт надо сделать в едином стиле.

    Действительно, не будешь же вносить повторяющиеся части HTML кода в каждый шаблон. В PHP-шаблонизаторах это решалось путем включений:

    В XSLT-преобразованиях есть аналогичный механизм >xsl:include / .

    Имеется файл main.xsl, который содержит «генеральный» шаблон, единый для всех страниц:

    В данном шаблоне есть правило , которое применяется ко всем элементам xml-документа. Данная инструкция, может быть заменена на .

    В нашем преобразовании должна быть инструкция и, соответственно, шаблонное правило, определенное в «генеральном» шаблоне:

    Если мы используем в «генеральном» шаблоне инструкцию то вместо используем именной шаблон: . В этом случае и технология разработки шаблонов – иная.

    В любом случае при использовании «генеральных» шаблонов надо придерживаться строго определенного формата выходных xml-данных.

    Например, у меня следующая структура:

    Под > понимается имя тега, соответствующему экшену в модуле, например, для экшена edit буде тег . Но разработка структуры — дело сугубо индивидуальное.

    В заключение хотелось бы заметить, что при использовании XSLT-процессора sablotron (версия php 4) необходимо определить базовую директорию, где лежат файлы включений, функцией xslt_set_base($xh, $filebase) , где переменная $filebase должна содержать полный путь к директории.

    Если что-то не получается.

    К сожалению, существующие XSLT-процессоры не имеют средств отладки. Приходится применять «дедовские способы» и «идти по шагам к цели», т.е. идти от разработки общих шаблонов к разработке частных шаблонов. Иначе это называют проектированием сверху вниз.

    Как правило, разработка шаблонов соответствует порядку разбора шаблонов, т.е. начинается с корневого элемента xml-данных. Может само обрамление дизайна – это уже дело рук самого дизайнера, но заготовку в виде пустого шаблона надо предусмотреть. И пошли так далее, углубляясь по ходу обработки структуры xml- данных.

    Если шаблон ничего не выводит, то надо проверить:

    • вызывается ли вообще данный шаблон (применяется ли к нему шаблонное правило)
    • наличие данных, обрабатываемых данным шаблоном
    • результат преобразования.

    Первое (вызывается ли вообще данный шаблон) проверяется довольно просто заменой нашего шаблона конструкцией типа:

    Если шаблон вызывался (применялось к нему шаблонное правило), то в результирующем документе увидим наши звездочки.

    Несколько труднее определить, какие входные узлы обрабатывал наш шаблон. Это определяется либо копированием обрабатываемых узлов в результирующее преобразование, либо определением имени обрабатываемого тега.

    Копирование узла осуществляется заменой нашего шаблона на следующую конструкцию:

    Результатом применения будет текст, содержащий значение текущего узла, обрамленного тегами .

    Определение имени обрабатываемого узла осуществляется заменой нашего шаблона на такой:

    Результатом применения будет текст, содержащий имя текущего узла, обрамленного тегами .

    Иногда полезно знать положение узла в контексте, тогда применим функцию position() к текущему узлу. Использование этой функции позволяет нам увидеть динамику прохода, т.е. применение шаблонных правил к текущей ветке xml-документа. Как правило, функцию position() применяют в циклах , но иногда применяют и к вызовам шаблонных правил.

    Проверка результата преобразования — это моделирование части работы шаблона (или всего полностью). Как и всякое моделирование, оно заключается в подготовке входных данных, которые должны представлять часть нашего xml-документа, самого шаблонного правила, т.е. набора части задействованных шаблонов, и, соответственно, простого скрипта преобразования, суть действий которого – взять файл xml-документа с диска, файл xsl-шаблона и вывести результат преобразования.

    Ближе к практике. Сортировка.

    Одна из часто применяемых практических задач – это вывод отсортированной таблицы, причем критерий сортировки определен данными, т.е. при разработке шаблона мы заранее знаем только перечень критериев, по которым будет производиться сортировка. Для примера возьмем прайс-лист, который можно отсортировать по:

    • цене
    • наименованию товара
    • наименованию группы товаров

    Если в шаблоне не запланировано вывода нескольких таблиц, то имя критерия сортировки можно содержать в корневом элементе. В случае, если таблиц несколько, то имя критерия сортировки, можно хранить в атрибуте корневого элемента фрагмента данных таблицы. Лично я использую для этого корневой элемент. Допустим, имеется следующая структура данных:

    Значение атрибута sort корневого элемента root определяет, какой тип сортировки использовать. В данном примере используется сортировка по категориям товаров (type).

    Шаблон, обрабатывающий тег

    ,
    и «строящий» таблицу, будет выглядеть следующим образом:

    Для реализации данного шаблона использован XSLT-элемент , который определяет XSLT переменную $sort . Данная переменная содержит значение атрибута sort корневого элемента root .

    Для определения критерия сортировки использовались предикаты выборки. При вычислении предиката его результат приводится к булевому типу. Синтаксически предикат заключен в квадратные скобки, т.е. конструкция типа показывает, что сортировка будет осуществляться для всех узлов по ключу, соответствующему атрибуту @type , при условии, что значение переменной $sort будет равно стоковому выражению «type». Соответственно, по каждому критерию, по которому будет осуществлена сортировка, необходима своя команда .

    Заключение

    Конечно, количество всяких методов и приемов при разработке XSLT шаблонов множество и «нельзя объять необъятное». В настоящее время даже появились разные стили написания шаблонов. Я попытался охватить лишь первые этапы «Путешествия в страну Шаблонизации».

    В данной статье были отражены в основном главные проблемы, с которыми сталкиваются юные XSLT-шаблонизаторы. Планируется продолжение.

    Уже после написания данной статьи автор узнал о существовании инструментария XSLT-разработчика, включающее средства XSLT-отладки. Это такие программные продукты, как: xselerate, Stylus Studio, Altova XML StyleVision. Данные программные продукты являются платными.

    Автор будет благодарен за любую критику данного материала, а также будет рад услышать ваши пожелания и узнать, с какими же вы сталкивались трудностями при разработке XSLT–шаблонов. Все замечания будут учтены при подготовке следующей статьи из цикла: «Шаблонизация на XSLT».

    XML для начинающих

    Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке).

    Вероятно, вы слышали о языке XML и вам известно множество причин, по которым его необходимо использовать в вашей организации. Но что именно представляет собой XML? В этой статье объясняется, что такое XML и как он работает.

    В этой статье

    Пометки, разметка и теги

    Чтобы понять XML, полезно вспомнить о том, как можно помечать данные. Документы создавались людьми в течение многих столетий, и на протяжении всего этого времени люди делали в них пометки. Например, учителя часто делают пометки в работах учащихся, указывая на необходимость переместить абзацы, сделать предложение более ясным, исправить орфографические ошибки и т. д. Посредством пометок в документе можно определить структуру, смысл и внешний вид информации. Если вы когда-либо использовали исправления в Microsoft Office Word, то вы знакомы с компьютеризованной формой добавления пометок.

    В мире информационных технологий термин «пометка» превратился в термин «разметка». При разметке используются коды, называемые тегами (или иногда токенами), для определения структуры, визуального оформления и — в случае XML — смысла данных.

    Текст этой статьи в формате HTML является хорошим примером применения компьютерной разметки. Если в Microsoft Internet Explorer щелкнуть эту страницу правой кнопкой мыши и выбрать команду Просмотр HTML-кода, вы увидите читаемый текст и теги HTML, например

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

    ) и местоположение рисунков.

    Отличительные черты XML

    Документы в форматах HTML и XML содержат данные, заключенные в теги, но на этом сходство между двумя языками заканчивается. В формате HTML теги определяют оформление данных — расположение заголовков, начало абзаца и т. д. В формате XML теги определяют структуру и смысл данных — то, чем они являются.

    При описании структуры и смысла данных становится возможным их повторное использование несколькими способами. Например, если у вас есть блок данных о продажах, каждый элемент в котором четко определен, то можно загрузить в отчет о продажах только необходимые элементы, а другие данные передать в бухгалтерскую базу данных. Иначе говоря, можно использовать одну систему для генерации данных и пометки их тегами в формате XML, а затем обрабатывать эти данные в любых других системах вне зависимости от клиентской платформы или операционной системы. Благодаря такой совместимости XML является основой одной из самых популярных технологий обмена данными.

    Учитывайте при работе следующее:

    HTML нельзя использовать вместо XML. Однако XML-данные можно заключать в HTML-теги и отображать на веб-страницах.

    Возможности HTML ограничены предопределенным набором тегов, общим для всех пользователей.

    Правила XML разрешают создавать любые теги, требуемые для описания данных и их структуры. Допустим, что вам необходимо хранить и совместно использовать сведения о домашних животных. Для этого можно создать следующий XML-код:

    Как видно, по тегам XML понятно, какие данные вы просматриваете. Например, ясно, что это данные о коте, и можно легко определить его имя, возраст и т. д. Благодаря возможности создавать теги, определяющие почти любую структуру данных, язык XML является расширяемым.

    Но не путайте теги в данном примере с тегами в HTML-файле. Например, если приведенный выше текст в формате XML вставить в HTML-файл и открыть его в браузере, то результаты будут выглядеть следующим образом:

    Izzy Siamese 6 yes no Izz138bod Colin Wilcox

    Веб-браузер проигнорирует теги XML и отобразит только данные.

    Правильно сформированные данные

    Вероятно, вы слышали, как кто-то из ИТ-специалистов говорил о «правильно сформированном» XML-файле. Правильно сформированный XML-файл должен соответствовать очень строгим правилам. Если он не соответствует этим правилам, XML не работает. Например, в предыдущем примере каждый открывающий тег имеет соответствующий закрывающий тег, поэтому в данном примере соблюдено одно из правил правильно сформированного XML-файла. Если же удалить из файла какой-либо тег и попытаться открыть его в одной из программ Office, то появится сообщение об ошибке и использовать такой файл будет невозможно.

    Правила создания правильно сформированного XML-файла знать необязательно (хотя понять их нетрудно), но следует помнить, что использовать в других приложениях и системах можно лишь правильно сформированные XML-данные. Если XML-файл не открывается, то он, вероятно, неправильно сформирован.

    XML не зависит от платформы, и это значит, что любая программа, созданная для использования XML, может читать и обрабатывать XML-данные независимо от оборудования или операционной системы. Например, при применении правильных тегов XML можно использовать программу на настольном компьютере для открытия и обработки данных, полученных с мейнфрейма. И, независимо от того, кто создал XML-данные, с ними данными можно работать в различных приложениях Office. Благодаря своей совместимости XML стал одной из самых популярных технологий обмена данными между базами данных и пользовательскими компьютерами.

    В дополнение к правильно сформированным данным с тегами XML-системы обычно используют два дополнительных компонента: схемы и преобразования. В следующих разделах описывается, как они работают.

    Схемы

    Не пугайтесь термина «схема». Схема — это просто XML-файл, содержащий правила для содержимого XML-файла данных. Файлы схем обычно имеют расширение XSD, тогда как для файлов данных XML используется расширение XML.

    Схемы позволяют программам проверять данные. Они формируют структуру данных и обеспечивают их понятность создателю и другим людям. Например, если пользователь вводит недопустимые данные, например текст в поле даты, программа может предложить ему исправить их. Если данные в XML-файле соответствуют правилам в схеме, для их чтения, интерпретации и обработки можно использовать любую программу, поддерживающую XML. Например, как показано на приведенном ниже рисунке, Excel может проверять данные на соответствие схеме CAT.

    Схемы могут быть сложными, и в данной статье невозможно объяснить, как их создавать. (Кроме того, скорее всего, в вашей организации есть ИТ-специалисты, которые знают, как это делать.) Однако полезно знать, как выглядят схемы. Следующая схема определяет правила для набора тегов . :

    Не беспокойтесь, если в примере не все понятно. Просто обратите внимание на следующее:

    Строковые элементы в приведенном примере схемы называются объявлениями. Если бы требовались дополнительные сведения о животном, например его цвет или особые признаки, то специалисты отдела ИТ добавили бы к схеме соответствующие объявления. Систему XML можно изменять по мере развития потребностей бизнеса.

    Объявления являются мощным средством управления структурой данных. Например, объявление означает, что теги, такие как и
    , должны следовать в указанном выше порядке. С помощью объявлений можно также проверять типы данных, вводимых пользователем. Например, приведенная выше схема требует ввода положительного целого числа для возраста кота и логических значений (TRUE или FALSE) для тегов ALTERED и DECLAWED.

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

    Преобразования

    Как говорилось выше, XML также позволяет эффективно использовать и повторно использовать данные. Механизм повторного использования данных называется преобразованием XSLT (или просто преобразованием).

    Вы (или ваш ИТ-отдел) можете также использовать преобразования для обмена данными между серверными системами, например между базами данных. Предположим, что в базе данных А данные о продажах хранятся в таблице, удобной для отдела продаж. В базе данных Б хранятся данные о доходах и расходах в таблице, специально разработанной для бухгалтерии. База данных Б может использовать преобразование, чтобы принять данные от базы данных A и поместить их в соответствующие таблицы.

    Сочетание файла данных, схемы и преобразования образует базовую систему XML. На следующем рисунке показана работа подобных систем. Файл данных проверяется на соответствие правилам схемы, а затем передается любым пригодным способом для преобразования. В этом случае преобразование размещает данные в таблице на веб-странице.

    В следующем примере представлено преобразование, которое загружает данные в таблицу на веб-странице. Суть примера не в том, чтобы объяснить, как создавать преобразования, а в том, чтобы показать одну из форм, которую они могут принимать.

    В этом примере показано, как может выглядеть текст одного из типов преобразования, но помните, что вы можете ограничиться четким описанием того, что вам нужно от данных, и это описание может быть сделано на вашем родном языке. Например, вы можете пойти в отдел ИТ и сказать, что необходимо напечатать данные о продажах для конкретных регионов за последние два года, и что эти сведения должны выглядеть так-то и так-то. После этого специалисты отдела могут написать (или изменить) преобразование, чтобы выполнить вашу просьбу.

    Корпорация Майкрософт и растущее число других компаний создают преобразования для различных задач, что делает использование XML еще более удобным. В будущем, скорее всего, можно будет скачать преобразование, отвечающее вашим потребностям без дополнительной настройки или с небольшими изменениями. Это означает, что со временем использование XML будет требовать все меньше и меньше затрат.

    XML в системе Microsoft Office

    Профессиональные выпуски Office обеспечивают расширенную поддержку XML. Начиная с 2007 Microsoft Office System, Microsoft Office использует форматы файлов на основе XML, например DOCX, XLSX и PPTX. Так как XML хранит данные в текстовом формате, а не в собственном двоичном формате, клиенты могут определять собственные схемы и использовать ваши данные разными способами, без необходимости платить ройалтиес. Дополнительные сведения о новых форматах см. в статье форматы Open XML и расширения имен файлов. Ниже приведены другие преимущества.

    Меньший размер файлов. Новый формат использует ZIP и другие технологии сжатия, поэтому размер файла на 75 процентов меньше, чем в двоичных форматах, применяемых в более ранних версиях Office.

    Более простое восстановление данных и повышенная безопасность. XML — это читаемость, поэтому если файл поврежден, вы можете открыть его в Microsoft Notepad или в другом текстовом средстве чтения и восстановить по крайней мере часть ваших данных. Кроме того, новые файлы более безопасны, поскольку они не могут содержать код Visual Basic для приложений (VBA). Если для создания шаблонов используется новый формат, все элементы ActiveX и макросы VBA располагаются в отдельном, более безопасном разделе файла. Кроме того, для удаления личных данных можно использовать инструменты, такие как инспектор документов. Дополнительные сведения об использовании инспектора документов см. в статье Удаление скрытых и персональных данных путем проверки документов.

    Все это замечательно, но что делать, если у вас есть XML-данные без схемы? Это зависит от того, какую программу Office вы используете. Например, при открытии XML-файла без схемы в приложении Excel оно предполагает, что схема существует, и дает возможность загрузить данные в XML-таблицу. Вы можете использовать XML-списки и таблицы для сортировки, фильтрации и вычисления данных.

    Включение средств XML в Office

    По умолчанию вкладка «Разработчик» не отображается. Ее необходимо добавить на ленту для использования команд XML в Office.

    В Office 2020, Office 2013 или Office 2010: Отображение вкладки «Разработчик».

    Практика XSLT

    Пример трансформации XML-документа в HTML

    XSLT — это мощное средство для трансформации XML-данных. Его часто используют как web-шаблонизатор: на вход подаётся XML-документ и XSLT-преобразование, а на выходе получают HTML-документ. Процесс получения HTML-документа из XML называют отображением или рендерингом.

    Рассмотрим типичный пример рендеринга HTML.

    Дан список музыкальных композиций в виде XML-документа.

    Отобразим данный документ в виде HTML ul/li списка, как это показано ниже:

    Для этого используем следующее XSLT-преобразование:

    Данное преобразование вернёт нам следующий HTML:

    XSLT-преобразование состоит из трёх шаблонов ( xsl:template ). Каждый шаблон обслуживает свою сущность, что даёт нам возможность легко вносить изменения и делает код понятным.

    Если нам надо поменять отображение списка (например, добавить атрибут class), то мы редактируем шаблон match=»PlayList» .

    Если же мы хотим изменить отображение элементов списка, то тут, совершенно очевидно, что стоить менять шаблон match=»Track»

    Фактически, XSLT не только даёт нам возможность разделить данные и представление (это задача любого шаблонизатора), но и позволяет разделять представления различных сущностей.

    Конечно, в более сложных случаях разделения добиться такого разделения бывает сложно. Очень легко прийти к ситуации, когда возникает «божественный шаблон», который делает всё, так же стоит бояться скатиться к «стрельбе дробью» кучей мелких шаблонов.

    Отладка XSLT

    Что мне очень нравится в XSLT, так это возможность отладки. Отладка помогает наглядно увидеть логику работы XSTL, структуру документа, значения переменных.

    Например, отладка поможет увидеть, что за сущность обрабатывает шаблон match=»/» .

    В Visual Studio отладка XSLT запускается сочетанием клавиш ALT+F5.

    Добавив в окно Watch XPath выражение » . » (точка), мы увидим, что текущий элемент шаблона — это корень (Root) документа. Здесь можно разместить контейнер div, или что-то относящееся ко всему XML-документу.

    Работа с сущностями XML

    Можно заметить, что в приведенных примерах присутствует сущность — Мы можем ее использовать, потому что определили ее в начале XSLT-документа

    Таким образом, — выводится, как символ с кодом — .

    Если нужно вывести строку «как есть», то стоит использовать CDATA следующим образом:

    Элемент xsl:text

    Хочу заострить внимание на элементе xsl:text . Он позволяет контролировать, что именно будет содержать TEXT-элемент. Значимость xsl:text очевидна на практике:

    Как видно из примера выше, отсутствие элемента xsl:text привело к появлению в HTML лишних переводов строк и пробелов.


    Безусловно, можно писать XSLT и без xsl:text , следующим образом:

    Такой шаблон трудночитаем и есть большая вероятность, что при сопровождении в нём будут появлятся ошибки.

    Нужно стараться, чтобы форматирование XSLT-шаблона не влияло на результат трансформации. Именно поэтому я считаю, что использовать xsl:text — это хорошая практика.

    Ветвления

    Для ветвлений в XSLT есть специальные элементы: xsl:if и xsl:choose . Но я считаю, что этими инструментами сильно злоупотребляют. Более интересен приём, позволяющий не загромождать шаблон ветвлениями.

    Рассмотрим пример реализации ветвлений:

    Дополним предыдущий пример возможностью выводить сообщение «Список пуст» в случае, если PlayList не содержит элементов Track .

    Решение с использованием xsl:choose будет таким:

    Решение с использованием дополнительного шаблона будет следующим:

    Второе решение, на мой взгляд, выглядит красивее: новая функциональность не добавила нового кода в старые шаблоны, новый шаблон максимально изолирован.

    Если понадобится добавить картинку к сообщению о пустом списке, то в первом случае скорее всего разбухнет элемент xsl:when в шаблоне match=»PlayList» . А вот во втором случае изменения будут только в специализированном шаблоне.

    В предыдущем примере мы разделили две абсолютно разные ветки рендеринга элемента списка. Но что если ветки различаются незначительно? Здесь использование xsl:if и xsl:choose вполне оправдано. Но мне бы хотелось показать другой подход: использование параметра mode у элемента xsl:template .

    В следующем примере навесим разные стили на чётные и нечётные элементы списка.

    Циклы и сортировка в XSLT

    Для циклов в XSLT есть элемент xsl:for-each , но схожий эффект можно получить, используя обычный xsl:apply-templates .

    Выведем список композиций, отсортированный по длительности.

    Вариант с использованием xsl:for-each :

    Вариант с использованием xsl:apply-templates :

    Как видно из кода, первый вариант короче и проще, но он нарушил принцип разделения ответственности для шаблонов. Теперь шаблон match=»PlayList» стал содержать логику отображения элемента Track.

    Казалось бы, ничего страшного, но представим задачу, когда в списке встречаются композиции с Id и без. Для композиции с ID нужно отрендерить ссылку, а для остальных вывести только текст.

    Вариант с использованием xsl:for-each :

    Вариант с использованием xsl:apply-templates :

    В случае xsl:for-each нам потребовалось добавлять ветвление, а в случае xsl:apply-templates — новый шаблон.

    Если бы шаблон match=»PlayList» уже содержал ветвления и логику, то нам понадобилось некоторое время, чтобы разобраться, куда именно нам нужно вставить ветку. Вариант с xsl:apply-templates лишён этого недостатка, поскольку мы лишь декларируем новый шаблон, а не пытаемся внедриться в старые.

    Использование xsl:for-each имеет ещё одну большую опасность. Если вы видите произвольный участок кода внутри шаблона match=»PlayList» , то предполагаете, что текущий элемент это PlayList , однако xsl:for-each меняет контекст. Увидев следующий код код:

    Вам потребуется внимательно присмотреться к контексту, чтобы понять, что select=».» на самом деле выбирает текущий Track .

    Шаблон mode=»TrackName» match=»Track» был добавлен для избежания дублирования кода, отображаюшего название. Я не сделал этого раньше, потому что в этом не было необходимости. Как только я заметил дублирование, я провёл рефакторинг и вынес общую логику отображения в новый шаблон.

    xsl:for-each — это способ не плодить сущности. Вы просто добавляете логику отображения внутрь xsl:for-each и всё прекрасно работает. Проблемы начинаются потом, когда тело цикла разрастается, а проводить рефакторинг xsl:for-each намного сложнее, чем выносить дублированный код.

    Заключение

    XSLT — это достаточно гибкий инструмент, он даёт возможность решить вашу задачу разными путями. Однако, при написании XSLT стоит уделять особое внимание сопровождаемости шаблонов.

    Надеюсь мои практические советы помогут вам писать более понятный код.

    В конце не могу удержаться, чтобы не опубликовать XSLT, которая позволит прослушать все композиции из демонстрационной XML.

    Создание отчетов на основе xsl-трансформаций (xslt)

    Опубликовано:
    25 января 2020 в 07:59

    XSLT (eXtensible Stylesheet Language Transformations) — язык преобразований xml-документов.

    Введение

    Задача генерирования отчетности в системе DIRECTUM является одной из наиболее востребованных.

    В этой статье описан возможно не самый широко распространенный способ формирования html-отчетов на основе xslt-преобразований. Но несомненно заслуживающий внимания, как один из наиболее удобных и наглядных (если сравнить например с rtf-отчетом).

    Если очень коротко, то xslt-преобразование заключается в трансформации xml-схемы с данными в отчет на основе предварительно подготовленного шаблона.

    Для примера отчета описанного в статье будет выводится список контрагентов с их наименованием, ИНН и адресом.

    Чтобы сформировать отчет понадобятся две составляющие:

    — xml-данные для отчета

    Данные в формате xml

    Данные в формате xml можно получить прямым sql-запросом:

    Описанный выше запрос вернет данные в таком формате:

    Данные нужно обернуть в тег и сохранить в файл, добавив заголовок:

    Вторая строка заголовка xml-файла данных важна, в ней указано, что в файле C:\Temp\template.xsl хранится шаблон отчета в который необходимо передать данные.

    В итоге получится такой xml-файл:

    Если открыть полученный xml-файл, браузер будет использовать указанный в заголовке шаблон и подставит данные в него.

    xsl-шаблон

    Далее необходимо создать шаблон, имя файла которого указано в заголовке xml-файла. xsl-шаблон отчета представляет собой обыкновенную html-страницу с особым заголовком:

    В тэге указаны версия и ссылка пространства имен xsl-преобразования. В остальном шаблон — это обыкновенная html-страница.

    Теперь нужно сотворить немного магии и указать какие именно данные из xml и в каком виде вставить в шаблон отчета.

    Для работы с данными в xsl-шаблоне используются специальные теги.

    Цикл for-each и правила выбора

    Чтобы перебрать все узлы из xml-файла данных нужно использовать конструкцию:

    Она позволит перебрать все дерево данных. Для того, чтобы выбрать только определенные данные из дерева используется правило выбора select=»orgs/org». Правила описаны на языке запросов XPath. В текущем примере будет последовательно отобрана каждый узел из .

    Сортировка

    Если необходимо, чтобы записи отображались не в порядке следования в xml-файле, а сортировались, то нужно указать это в шаблоне:

    Теперь записи будут перебираться предварительно отсортированными по наименованию.

    Отображение значения

    Но просто перебрать не достаточно, нужно вывести в отчет нужные данные, для этого существует конструкция:

    Конструкция отобразит значение тэга (наименование контрагента).

    Гиперссылки

    Чтобы сделать из наименования контрагента ссылку, по которой можно будет открыть запись справочника, нужно немного модифицировать код:

    Сase-оператор и фильтрация

    Пусть ИНН контрагента отображается в отчете не просто так. Если ИНН в карточке отсутствует, то будет выводится сообщение об отсутствии ИНН. Для этого необходимо использовать конструкцию:

    В конструкции choose с помощью фильтра test проводится проверка содержимого тэга (ИНН) на пустое значение ( ). Если содержимое не пусто, то выводиться значение. В других случаях выводится сообщение «ИНН не указан».

    Еще один фильтр

    С помощью фильтра возможно реализовать еще одну «рюшечку», которая будет помечать контрагентов с ИНН начинающихся например с кода региона «18». Выглядеть это будет так:

    Конструкция для всех записей ИНН которых начинается с «18» дополнительно выведет значок ♥ .

    В конечном итоге получится такой код шаблона:

    Результат

    А если открыть xml-файл в браузере, то получится такой отчет:

    Вывод

    В статье описаны только несколько базовых возможностей xsl, такие как фильтры, сортировка, цикл, case-конструкция. Кроме них существуют еще интересные возможности. Надеюсь, статья подтолкнет изучить и их. Возможно после этого построение отчетов станет более интересным.

    А если к отчету подключить такой мощный инструмент как javascript, то описанный отчет легко можно сделать интерактивным. Например добавить элемент, позволяющий проводить какую-либо фильтрацию. Или отображать графики по данным отчета.

    Какие есть плюсы при реализации отчетов описанным способом:

    — Требуется разработка относительно небольшого количества прикладных вычислений;

    — Разработка шаблона наглядна и также относительно нетрудоёмка.

    Всё описанное в статье легко интегрируется в аналитический отчет, ссылка на который приведена ниже.
    Пример xsl отчета

    Собственно отображение задач в Директум выполняется как раз таким образом.

    Опять же трансформацию можно производить программно:

    Не увидел в статье ответа на вопрос зачем нам выгружать данные сначала в xml-файл, а потом еще и писать xslt (который еще и изучить надо), если можно сразу выгрузить в формате html (по сути это тот же xml).
    Аргументируйте, пожалуйста, и приведите примеры, применимые к отчетам Directum.
    Обычно разделение данных и представления делают когда надо одни и те же данные надо по-разному отображать (отображать в нескольких представлениях динамически формируемые данные или если данные хранятся где-то и отображение может со временем меняться).
    С отображением схем задач понятно почему надо использовать xslt — у нас данные уже есть, их надо только отобразить. Я не встречал никогда чтобы данные еще где-то хранились в xml и их надо было только отобразить.
    К недостаткам представленного подхода еще можно отнести то, что xsl-файл еще надо где-то размещать, чтобы отчет можно было переслать по почте, например.

    Александр, статья писалась для разработчиков, которые еще не слышали (или слышали, но краем уха) про xslt. И призвана подтолкнуть их к изучению этой темы.
    По поводу того «зачем нам выгружать данные сначала в xml-файл» — можно и не выгружать, а реализовать по-другому, как например выше в комментарии описал Роман.
    «а потом еще и писать xslt (который еще и изучить надо)» — именно для этого статья и писалась, чтобы начать изучать xslt.
    Про «сразу выгрузить в формате html» — чтобы это сделать, все равно нужно вычисления писать, которые данные «обернут» в тэги html-разметки. И такой путь не соответсвует парадигме MVC. Если отчетик небольшой и известно, что никаких изменений в нем не предвидится, то, возможно, отступить от этой парадигмы не страшно.
    Но если предполагается, что периодически необходимо вносить доработки в отчет, то поддержка такого отчета станет трудоемкой задачей.
    К примеру сейчас сущетсвует достаточно много государственных сервисов, которые выдают информацию в виде xml. Эти данные можно сразу отображать в удобно перевариваемом виде, в нужной форме.
    А если случится так, что форма видоизменится и/или в xml добавятся новые (или удалятся старые) реквизиты, то достаточно подкорректировать xsl-шаблон, чтобы форма отчета осталась актуальной не проводя при этом доработок вычислений.
    Что касается размещения xsl-файла. То размещать его можно, к примеру, в аналитическом отчете. А чтобы отправить отчет сформированный по xsl-шаблону сам шаблон уже не нужен, можно отправить html-страницу построенную на основе шаблона.

    Алексей,
    Если у нас уже есть xml и нам надо его отобразить пользователю, то я согласен что надо использовать xslt.
    Не надо показывать незнающим разработчикам что надо сначала выгружать sql-запросом в xml, учить xsl и писать преобразование. Думаю, нужна статья, показывающая, что в большинстве случаев html можно и надо формировать прямо на sql. Отображение sql -> html частая задача, xml->html редкая. Изучать что-то новое (при этом сомнительно удобное) и делать на нем все подряд отчеты не стоит. Потому что тем, кому достанется такое наследие, тоже придется учить xslt.
    Разделить данные и представление можно в рамках одного sql-запроса. Так что выгружать сначала в xml, а потом его преобразовывать в HTML xslt нет особого смысла, ведь промежуточный xml нигде использоваться не будет. Вот как выглядит sql-запрос для такого же результата:

    Это я всё к тому, что статья в каком-то неправильном ключе подана. Сам по себе материал полезен, но логичнее было бы сразу указать, что такой подход стоит использовать если уже есть xml или он для чего-то нужен, а не как промежуточное звено. А лучше сначала написать статью про формирование html-отчетов с помощью for xml, про эту штуку думаю тоже мало народу знает, хотя она ну очень удобная. SQL знают все, учить почти ничего нового не надо.

    Александр,
    Выше я уже написал, что статья для того, чтобы подтолкнуть разработчиков к изучению xsl. И приведенный пример не является идеальным ни с технической, ни с точки зрения бизнес-процессов. Это просто демо-пример с помощью которого описаны базовые xsl-конструкции.
    Отвечу на некоторые Ваши утверждения, которые кажутся мне спорными:
    «Отображение sql -> html частая задача, xml->html редкая» — очень спорное утверждение. Слишком много ньюансов для решения различных задач и в каждой задаче луший вариант необходимо выбирать. Универсального нет.
    «лучше сначала написать статью про формирование html-отчетов с помощью for xml» — думаю, тема тоже интересная, но эта статья именно про xsl.
    «SQL знают все, учить почти ничего нового не надо» — тоже спорное утверждение.
    «Разделить данные и представление можно в рамках одного sql-запроса» — можно. Но далеко не всегда нужно. Все-таки основная задача SQL-сервера не в этом. Особенно это касается крупных заказчиков, у которых SQL-сервер загружен «основной» работой. И, опять же, цель статьи была — рассказать именно про xsl.
    И по результатам переписки, думаю Вам есть что рассказать по тематике отображения данных базы данных в виде html-страницы. Если бы такая статья(и) появились на клабе, то было бы очень здорово. Сам бы с удовольствием почитал.

    Алексей, давайте не уходить в сторону от основного вопроса, он звучит так: зачем мне делать SQL->XML->[xslt]->HTML, если можно SQL->HTML.
    1) Если у нас уже есть XML (в таком формате хранятся данные или в таком формате откуда-то приходит), то я согласен, что хорошим вариантом отображения является использование XSLT. Собственно статья об этом (а не о том, что ВООБЩЕ отчеты хорошо и удобно строить используя xslt). И это надо указать в статье, и не приводить смущающих примеров (с выгрузкой в XML с SQL) и сравнивать с rtf. Подавляющее большинство отчетов в Directum строится на основе данных из SQL-таблиц, а не XML.
    2) Аргумент про то, что это не задача SQL — он смешной. SQL это делать умеет, и делает это быстро, дешево и удобно. По сравнению с «лишней» нагрузкой, которую создает работа с ОМ и говнокод, работа с XML — просто семечки. А еще напомню про существование приложений (я лично работал с WebTutor), для которых XML — чуть ли не основной тип хранимых данных и все выборки и преобразования XML производятся в БД. Ну и писать такое и в примере делать SQL->XML как-то нелогично.
    3) Чтобы использовать Ваш подход, надо знать и SQL->XML и XSL. Мой же вариант проще, достаточно знать SQL->XML(HTML). Я не услышал ни одного аргумента в пользу SQL->XML->[xslt]->HTML. Сначала Вы говорите, что мой подход «не соответсвует парадигме MVC», а когда я пишу что данные и представление можно разделить и в рамках одного SQL-запроса и XML в вашем подходе ИСПОЛЬЗУЕТСЯ ТОЛЬКО КАК ПРОМЕЖУТОЧНОЕ ЗВЕНО (а не как модель), Вы пишете что разделять модель и представление «далеко не всегда нужно».

    Вы можете придумать конкретный пример, когда нам гораздо удобнее и разрабатывать и поддерживать веб-отчет используя SQL->XML->[xslt]->HTML, а не SQL->HTML? Я лично изучал xsl, пытался пользоваться. Но за 5 лет реально что-то делал SQL->XML->[xslt]->HTML 1 раз и то потом переделал на SQL->HTML потому что xsl было излишеством, которое, к тому же, мало кто знал. Я видел веб-контролы в канцелярии на xslt и мое мнение — они слишком сложны для такой простой задачи. SQL->HTML я использовал раз 50 наверно уже (как для простых задач, так и для сложных 1, 2 etc). И не потому что не знаю xsl, а потому что SQL->HTML проще и удобнее. Возможно мне не попадались подходящие задачи, но такой вот у меня опыт. А Вы сколько раз делали SQL->XML->[xslt]->HTML и SQL->HTML?

    Введение в XSLT

    XSLT представляет собой способ для XML-документов в другие XML или документы язык документа XHTML.

    XPath это язык для навигации в XML-документах.

    Вы должны иметь базовые знания

    Перед тем, как продолжать учиться, мы должны иметь общее представление о следующем:

    • HTML / XHTML
    • XML / пространство имен XML
    • XPath

    Если вы хотите изучать эти предметы во- первых, пожалуйста , наш домашняя страница , чтобы получить доступ к обучающим.

    Что такое XSLT?

    • преобразование XSLT XSL средство (XSL Transformations)
    • XSLT является наиболее важной частью XSL
    • XSLT может преобразовать документ XML в другой документ XML
    • XSLT использует XPath для навигации в XML-документах
    • XSLT является стандартом W3C

    XSLT = преобразование XSL

    XSLT является наиболее важной частью XSL.

    XSLT используется для преобразования документа XML в другой документ XML, или может быть идентификация браузера других типов документов, таких как HTML и XHTML. Как правило, XSLT каждым элементом XML преобразуется в (X) HTML элементов, чтобы завершить эту работу.

    В XSLT можно добавлять элементы и атрибуты в выходной файл, или удалить элементы и атрибуты из выходного файла. Кроме того, можно изменить и сортировать элементы, выполнять тесты и решить, чтобы скрыть или показать, какой элемент, и так далее.

    Одно общее утверждение описывает процесспреобразования, XSLT к исходному XMLдерева в результирующее дерево как XML.

    XSLT использует XPath

    XSLT использует XPath, чтобы найти информацию в документе XML. XPath используется для навигации по элементов и атрибутов в XML-документе.

    Если вы хотите сначала узнать XPath, пожалуйста , посетите наш XPath учебник .

    Как это работает?

    В процессе преобразования, XSLT использует XPath для определения исходного документа может соответствовать один или несколько предопределенных шаблонов раздел. После того, как найдено совпадение, XSLT положит соответствие часть исходного документа в результирующий документ.

    XSLT является стандартом W3C

    XSLT в 16 ноября 1999 года был создан в качестве стандартов W3C.

    Для получения более подробной информации о W3C деятельности XSLT, пожалуйста , посетите наш W3C учебник .

    Знакомство с XML и XSLT. Применение XML и XSLT. Зачем изучать XML и XSLT

    Этой статьей я открываю новую рубрику на блоге dmitriydenisov.com под названием «Уроки XML и XSLT». В ней мы пошагово изучим такой очень функциональный, универсальный и расширяемый язык разметки, как XML. После этого мы плавно перейдем к технологии преобразования XSLT, которая позволяет с легкостью управлять данными XML и буквально творить чудеса.

    Сразу также хочется заметить, что эти технологии в основном используются на крупных коммерческих проектах. Особенно это касается запада, где XML и XSLT активно используются уже на протяжении нескольких лет. К сожалению, до нас эти технологии еще не успели дойти в полной мере.

    Из этого стоит сделать вывод, что знание XML и XSLT будет для вас огромным плюсом, так как на данный момент специалистов в этой области не так уж и много. В результате через несколько лет, когда XML и XSLT наберет популярности и у нас, у вас будет огромное преимущество перед теми, кто еще не успел овладеть этой технологией. Как вы уже поняли, это позволит вам расширить свои возможности и увеличить свой доход. А кто не хочет сейчас заработать? Думаю, таких мало.

    В связи с этим я решил помочь всем желающим и написать серию статей посвященных этой теме. К сожалению, на данный момент очень мало качественной и понятной литературы для самостоятельного изучения XML и XSLT. Что касается разнообразных курсов, то они зачастую являются очень дорогостоящими и не у каждого могут оказаться деньги. Честно говоря, и у меня их нет, поэтому я и занимаюсь самостоятельным обучением, а не хочу по курсамJ

    Сказать по правде, не всегда все идет гладко. Порой приходится долго разбираться в некоторых моментах для того, чтобы понять всю суть того, что изучаешь. Исходя из этого, я постараюсь писать статьи максимально кратко и понятно, и в то же время не загружать вас ничем лишним. Весь материал будет разбит на части и подробно изложен в статьях объемом 800 – 1200 слов. На мой взгляд, это оптимальный размер статьи, который позволяет подробно изложить весь материал и избежать нагромождения лишней информацией. Думаю, со мной многие согласятся.


    Итак, теперь давайте рассмотрим, в каком порядке будет происходить изучение XML и XSLT.

    Что будет рассматриваться в рубрике «Уроки XML и XSLT»

    Для начала мы изучим основы языка разметки XML, рассмотрим базовые понятия XML, а также разберемся с описанием структуры XML документов (DTD, XML Schema). Таким образом, мы получим базовые знания для работы с XML.

    Далее мы перейдем к изучению основ XSLT. Для этого нам понадобится также немного изучить основы XPath. Мы рассмотрим основные элементы XSLT, а также возможности XSLT. Также на протяжении всего обучения будут приводиться разнообразные примеры для лучшего усвоения материала. Таким образом, обучение будет максимально быстрым и интересным.

    Ну а теперь давайте перейдем к завершающей части статьи и рассмотрим, где же применяется технологии XML и XSLT, а также какие они имеют возможности.

    Использование расширяемого языка разметки XML

    XML – очень функциональный язык разметки, который широко применяется во многих сферах. На нем работают многочисленные программы и приложения, начиная с обычных RSS лент и заканчивая такими крупными проектами, как Microsoft Word. Убедиться в последнем очень просто. Для этого смените расширение документа Microsoft Word с docx на zip. Далее распакуйте получившийся архив, после чего перейдите в папку word. В ней вы найдете XML файлы, в которых и хранится вся информация документа Word.

    Отредактировав необходимые файлы, в частности файл word/document.xml, вы можете произвести обратную процедуру и запаковать все файлы обратно в zip архив. Далее сменить расширение архива на docx и открыть файл программой Microsoft Word. В результате вы увидите все изменения, которые вы вносили в XML документ.

    Таким образом, мы видим, что XML это универсальный, расширяемый язык с очень широкими возможностями. Благодаря этому он с успехом может использоваться в самых разнообразных проектах, начиная с небольших сайтов и заканчивая многомиллиардными проектами, такими как Microsoft Office.

    Поскольку это только вводная статья, то мы не будем слишком углубляться в основы языка и сферы его применения. Более подробно обо всем этом мы еще поговорим в соответствующих статьях рубрики «Уроки XML и XSLT».

    Использование языка преобразования XML-документов XSLT

    XSLT является очень мощным инструментом для работы с XML. С его помощью можно с легкостью преобразовывать XML данные, а также получать доступ к нужным нам элементам. Например, у нас есть исходный файл с перечислениями стран в формате XML и мы хотим получить названия всех стран Европы в формате HTML. Для этого достаточно написать небольшой XSLT шаблон, который обработает XML файл и сформирует готовую HTML страницу со списком нужных нам стран. Аналогичным образом результат может быть представлен также и в XHTML, XML или просто в виде текстового документа.

    По сути сам XSLT является набором правил, которые применяются к документу при определенных условиях. Его также еще называют таблицами стилей XLST, хотя, на мой взгляд, между таблицами стилей CSS и XSLT практически нет ничего общего. Таким образом, в результате обработки XML документа мы получаем то, что задано в XSLT шаблоне. Это немного похоже на работу CSS, но только лишь немного. На самом деле в XSLT есть очень большое количество других возможностей, которые никак несравнимы с возможностями CSS.

    Ну а теперь давайте подведем небольшой итог.

    XML и XSLT являются очень мощными инструментами, как для веб-разработчиков, так и для разработчиков в других сферах. С их помощью решения множества задач становятся очень простыми, что в свою очередь и послужило тому, что данные технологии становятся все более и более популярными. При этом зачастую не требуется знание каких-либо языков программирования, хотя сам XSLT может с успехом использоваться в связке с C++, JavaScript и т.д.

    Одним словом, XML и XSLT являются очень полезными инструментами, и их знание поможет вам значительно расширить свои возможности. Таким образом, если вы разработчик и у вас есть свободное время, рекомендую вам изучить XML и XSLT.

    На этом данная статья подошла к концу. Может она получилась немного запутанной, но что сделано, то сделано. Возможностей здесь очень много и если писать обо всех из них, то можно написать целую книгу. Исходя из этого, был приведен лишь минимум информации для того, чтобы только заинтересовать и мотивировать вас к обучению.

    Итак, если вы не хотите пропустить выпуска других статей уже непосредственно посвященных XML и XSLT, рекомендую подписаться на новостную рассылку любым удобным для вас способом в пункте «Подписка», либо воспользоваться формой подписки, которая находится чуть ниже на странице.

    На этом все. Удачи вам и успехов в изучении XML и XSLT.

    Трансформации XML

    С помощью LINQ to XML можно выполнять трансформации XML, используя для этого два совершенно разных подхода. Первый подход заключается в применении языка через классы-мосты — XmlReader и XmlWriter. Второй подход предусматривает использование для трансформаций самого API-интерфейса LINQ to XML за счет функционального конструирования целевого документа XML и встраивания запроса LINQ to XML в некоторый документ XML.

    Применение XSLT обладает тем преимуществом, что это — стандартная технология XML. Существует инструментарий, который помогает в написании, отладке и тестировании трансформаций XSLT. Вдобавок, поскольку он уже существует, доступны готовые XSLT-документы, которые можно использовать в новом коде с применением LINQ to XML.

    Существует множество доступных XSLT-документов, из которых можно выбрать нужные. К тому же, использование XSLT для трансформаций наиболее динамично. В отличие от применения подхода на основе функционального конструирования LINQ to XML, повторно компилировать код для изменения трансформации не понадобится. Простое изменение документа XSLT позволяет модифицировать трансформации во время выполнения.

    И, наконец, XSLT — широко известная технология, и есть немало знающих ее разработчиков, которые могут оказать помощь. Что касается подхода на основе функционального конструирования, то пока, на начальном этапе существования LINQ, это еще не так.

    Применение подхода с функциональным конструированием не потребует больших затрат. Оно позволит выполнять трансформации XML, не зная ничего помимо LINQ to XML. Поэтому если вы не знакомы с XSLT, а потребности в трансформации скромны, этот подход может оказаться более подходящим. К тому же, хотя функциональное конструирование менее удобно, чем простая модификация документа XSLT, необходимость перекомпиляции кода для модификации трансформаций может добавить безопасности.

    Трансформации с использованием XSLT

    Чтобы выполнить трансформацию с использованием XSLT, необходимо обратиться к классам-мостам XmlWriter и XmlReader, экземпляры которых получаются из методов CreateWriter и CreateReader классов XDocument.

    Пример, показанный ниже, требует некоторых пояснений, которые будут приводиться по мере продвижения по коду. Для начала определяется таблица стилей трансформации:

    Здесь нет ничего особо выдающегося. Просто указывается XSL-разметка для создания некоторой HTML-разметки, предназначенной для отображения типичного XML-документа с сотрудниками в виде HTML-таблицы. Далее создается XML-документ с сотрудниками:

    Это просто обычный XML-документ. А теперь о том, где начинается «магия». Необходимо создать новый XDocument для трансформированной версии. Затем из этого документа будет построен XmlWriter, создан экземпляр объекта XslCompiledTransform, загружен объект трансформации с помощью таблицы стилей трансформации и выполнена трансформация входного XML-документа в выходной XmlWriter:

    Разумеется, после всего этого трансформированная версия документа отображается. Как видите, для выполнения трансформации используются оба класса-моста — XmlWriter и XmlReader. Ниже показан результат:

    Трансформация с использованием функционального конструирования

    Хотя LINQ to XML поддерживает трансформацию XSLT, существуют очень эффективные способы выполнения трансформаций на основе самого API-интерфейса LINQ to XML.

    Логически рассуждая, трансформация может быть сведена к комбинации функционально сконструированного дерева XML с встроенным запросом XML. Для выполнения трансформации комбинируйте функциональное конструирование со встроенным запросом XML LINQ.

    XML-трансформации лучше всего объяснить на примере. Во многих примерах, которые приводились ранее, посвященных LINQ to XML, работа осуществлялась со следующим деревом XML:

    Предположим, что это дерево XML нужно трансформировать в следующее:

    Для проведения этой трансформации будет использоваться функциональное конструирование со встроенным запросом. С помощью этого подхода будет функционально сконструирован новый документ, соответствующий желаемой выходной древовидной структуре XML, с получением необходимых для этого данных из исходного документа XML с помощью запроса LINQ to XML. Функциональное конструирование и логика запроса определяются желаемой выходной древовидной структурой. Код представлен ниже:

    В приведенном коде изначально создается XML-документ xDocument, который будет трансформироваться и отображаться. Затем строится новый трансформированный документ xTransDocument и корневой узел MediaEmployees, включая атрибут type. Затем генерируется элемент Employee для каждого элемента Employee исходного XML с помощью операций Element и Elements. После этого строится сама проекция элемента Employee, используя LINQ-операцию Select И, наконец, трансформированный XML-документ отображается. Давайте посмотрим, получено ли в результате то, что было нужно:

    Все прошло блестяще! Вывод соответствует ожиданиям. Неплохо, если учесть, что не использовалось ничего помимо LINQ to XML.

    XML TO XML using XSL

    I have trouble trying to convert this xml format

    Into this xml format

    I have tried this with disasterus results. It just erases everything and gives me the raw data!

    These xmls are just an example of the export(first) of a long output from a product data-table , and the second only an example of one product, but i wish this format could be applied to all the products of the first , no matter how many.

    Is the XSL the correct way? Is this even possible or there is a better one? This is in a C# program Btw.

    Глава 1

    Добро пожаловать в мир языка преобразований расширенной таблицы стилей, XSLT (Extensible Stylesheet Language Transformations). Эта книга послужит вам путеводителем в огромном мире XSLT, который каждую минуту расширяется непредсказуемым образом. Мы хотим, чтобы этот мир стал и вашим миром. Нам нужно охватить весьма большой материал, поскольку в наши дни XSLT используется в очень интересных местах и очень интересными способами. В этой книге вы увидите, как это все работает.

    Собственно XSLT представляет собой средство обработки и форматирования содержимого документов XML. XML уже стал очень популярным, теперь настала очередь XSLT. XML дает вам возможность структурировать данные в документах, a XSLT позволяет работать с содержимым документов XML — оперировать содержимым и создавать другие документы (например, при сортировке XML записей базы данных сотрудников или при сохранении данных в документ HTML, а также при детальном форматировании данных).

    С содержимым документов XML можно работать, написав собственную программу, реализующую интерфейс с приложениями разборщика (parser) XML, однако при этом приходится писать код программы самостоятельно. При помощи XSLT вы можете выполнять задачи подобного же рода, не прибегая к программированию. Вместо того чтобы писать код обработки содержимого документов XML на Java, Visual Basic или С++, можно просто указать при помощи XSLT, что вы хотите сделать, и процессор XSLT сделает все остальное. Именно для этих целей и предназначен XSLT, и в мире XML он выходит на ключевые позиции.

    XSL = XSLT + XSL-FO

    Сам XSLT в действительности является частью более крупной спецификации — расширенного языка таблиц стилей, Extensible Stylesheet Language, или XSL. XSL предназначен для задания точного, до миллиметра, формата документов.

    Форматирующая часть XSL, представляющая гораздо более крупную спецификацию, чем XSLT, основана на специальных форматирующих объектах (formatting objects) — эта часть XSL часто называется XSL-FO (или XSL:FO, или XSLFO). XSL-FO — сложная тема, поскольку задание стилей документов при помощи форматирующих объектов может оказаться весьма запутанным процессом. Фактически XSLT изначально был добавлен в XSL для того, чтобы проще осуществлять преобразование документов XML в документы, основанные на форматирующих объектах XSL-FO.

    Эта книга посвящена XSLT, но рассматривается также и введение в XSL-FO, в том числе способ использования XSLT для преобразования документов в форму XSL-FO; в конце концов, XSLT впервые был представлен для упрощения работы с XSL-FO. В начале данной главы будет приведен обзор как XSLT, так и XSL-FO.

    Краткая историческая справка

    XSL был создан консорциумом World Wide Web Consortium (W3C, www.w3.org) — объединением групп, первоначально возглавлявшимся Тимом Бернерс-Ли (Tim Berners-Lee). W3C — это комитет, выпускающий спецификации, — такие, как спецификация для XSL, используемая в данной книге. Именно спецификации делают XML и XSL тем, чем они являются.

    Вы можете прочитать об истории работы комитета W3C с языками стилей по адресу www.w3.org/Style/History. Интересно посмотреть, какая объемная работа была проделана и как много языков стилей сменилось за это время.

    W3C первоначально, в 1980-х, разработал «дедушку» XML, SGML (Standard Generalized Markup Language, стандартный обобщенный язык разметки), однако он был слишком сложен для того, чтобы завоевать широкую популярность, и в действительности XML (как и HTML) представляет собой упрощенную версию SGML. W3C также создал для работы совместно с SGML язык стилей DSSSL (Document Style Semantics and Specification Language, язык семантики стиля и спецификации документа) — и так же, как XML был произведен от SGML, XSL основан на исходном DSSSL. Как утверждает W3C: «Модель, используемая XSL для отображения документов на экране, базируется на многих годах работы над сложным языком стилей по стандарту ISO, который называется Document Style Semantics and Specification Language (DSSSL)».

    Однако исходная часть XSL, то есть XSL-FO, все равно оказалась не настолько простой, чтобы найти широкое распространение, поэтому XSLT был представлен как средство упрощения преобразования документов XML в форму XSL-FO. Как оказалось, именно XSLT был взят на вооружение, поскольку он представляет собой законченный язык преобразований, позволяющий работать с содержимым документов XML без написания программного кода, преобразовывать эти документы в другие документы XML, формат HTML или другие основанные на текстах форматы. Большой успех XSLT удивил даже W3C.

    Преобразования XSLT-XSL

    XSLT позволяет работать непосредственно с содержимым документов XML. Например, у вас может быть огромный документ XML, содержащий всю бейсбольную статистику за последний сезон, однако вас может интересовать только статистика для питчеров. Чтобы извлечь только эти данные, можно написать программу на Java, Visual Basic или С++, которая будет работать с разборщиками XML. Разборщики представляют собой специальные программные пакеты, читающие документы XML и передающие все данные документа последовательно в ваш код. Затем можно создать новый документ XML, pitchers.xml, содержащий только данные о питчерах.

    Этот способ работает, однако при этом необходимо довольно много программировать и тратить много времени, в том числе и на тестирование. XSLT разрабатывался для решения подобных проблем. XSLT могут читать процессоры XSLT, обрабатывающие документы XML: все, что вам нужно сделать, — это создать таблицу стилей XSLT, определяющую правила, которые вам требуется применить для преобразования одного документа в другой. Никакого программирования не понадобится, что является несомненным достоинством в глазах многих людей, даже опытных программистов. В примере с бейсболом вам нужно написать таблицу стилей XSLT, определяющую необходимые действия, и предоставить процессору XSLT довершить все остальное.

    Помимо преобразования одного документа XML в другой документ XML, можно также преобразовывать документы XML в документы разных типов — таких, как HTML, документы форматированного текста (RTF), документы, использующие XSL-FO и другие. Можно также преобразовать документы XML в иные основанные на XML языки — такие, как MathML, MusicML, VML, XHTML и другие — все это можно осуществить, не прибегая к программированию.

    Во многих случаях язык XSLT может работать аналогично языку баз данных, такому как SQL (Structured Query Language, язык структурированных запросов, — известный язык доступа к базам данных), поскольку он позволяет извлекать требуемые данные из документов XML во многом похоже на то, как инструкция SQL извлекает данные из базы данных. Иногда даже говорят о XSLT как о SQL в Web, и если вы знакомы с SQL, это даст вам некоторое представление о безграничных возможностях XSLT. Например, при помощи таблицы стилей XSLT можно извлечь подмножество данных из документа XML, создать оглавление для большого документа, найти все элементы, удовлетворяющие определенному условию (например, поставщиков с определенным индексом) и т.д. И все это — за один шаг!

    XSL-FO: форматирующие объекты XSL

    Другая часть XSL — это XSL-FO, форматирующая часть языка XSL, с которой мы также познакомимся в этой книге. При помощи XSL-FO можно определить способ представления данных в документах XML, вплоть до размера полей, шрифтов, выравнивания, размера заголовка и подзаголовка, а также ширины страницы. При форматировании документа XML приходится думать о множестве вещей, и, соответственно, XSL-FO значительно объемистее, чем XSLT.

    С другой стороны, из-за излишней сложности XSL-FO не очень популярен, и его нельзя сравнивать с XSLT в этом отношении. Существует не так много программ, поддерживающих XSL-FO, и ни одна из них не реализует достаточно полное приближение к стандарту. Так же как самый распространенный способ применения XSLT — это преобразование XML в HTML, самый распространенный способ применения XSL-FO — преобразование XML в текст в формате PDF (Portable Data Format, переносимый формат данных), используемый в Adobe Acrobat. Пример такого преобразования приведен в конце этой главы, а также в главе 11.

    Спецификации W3C

    W3C выпускает спецификации как для XML, так и для XSL, и именно с ними мы будем работать на протяжении всей книги. Спецификации W3C не называются стандартами, поскольку, по международным соглашениям, стандарты могут создаваться только уполномоченными государством комитетами. Вместо этого W3C начинает с выпуска требований (requirements) для новой спецификации. Требования представляют собой список целей и обзоров спецификации, но сама спецификация на этот момент еще не написана. Далее W3C выпускает спецификации: сначала в виде рабочих проектов (working drafts), которые могут комментировать все заинтересованные лица, затем в виде рекомендаций-кандидатов (candidate recommendations), которые еще могут быть изменены; и, наконец, в виде окончательных рекомендаций (recommendations), которые уже нельзя изменять.

    В следующем списке приведены имеющие отношения к XSLT спецификации W3C, которые мы будем использовать в книге, и адреса, по которым их можно найти:

    • полная рекомендация-кандидат XSL www.w3.org/TR/xsl/. Это большой документ, определяющий все аспекты XSL;

    • рекомендация XSL Transformations 1.0 по адресу www.w3.org/TR/xslt. Предназначение XSLT состоит в преобразовании содержимого документов XML в другие документы, и именно поэтому XSL стал таким популярным;

    • рабочий проект XSLT 1.1 по адресу www.w3.org/TR/xslt11. Это рабочий проект XSLT 1.1, который не будет далее разрабатываться до рекомендации — W3C планирует добавить всю функциональность XSLT 1.1 в XSLT 2.0;

    • требования XSLT 2.0 по адресу www.w3.org/TR/xslt20req. W3C выпустил группу целей для XSLT 2.0, включая дополнительную поддержку схем XML;

    • спецификация XPath 1.0 по адресу www.w3.org/TR/xpath. XPath используется для нахождения и указания на определенные разделы и элементы в документах XML так, чтобы можно было с ними работать;

    • требования XPath 2.0 по адресу www.w3.org/TR/xpath20req. XPath в данный момент обновляется — добавляется дополнительная поддержка XSLT 2.0.

    Версии XSLT

    Спецификации XSLT разрабатывались значительно активнее, чем спецификации для всего XSL. Рекомендация XSLT 1.0 была окончательно принята 16 ноября 1999 г., и эта версия является сегодня основной версией XSLT.

    Затем появился рабочий проект XSLT 1.1 и, хотя первоначально он рассматривался в качестве пролога новой рекомендации, ряд сотрудников W3C начал работать над XSLT 2.0 — и через некоторое время W3C решил прекратить работу над рекомендацией XSLT 1.1. Это означает, что рабочий проект XSLT 1.1 не будет развиваться далее — он навсегда останется в виде рабочего проекта и никогда не станет рекомендацией. Иными словами, не будет выпущено официальной версии 1.1 для XSLT.

    Однако консорциум W3C также утверждает, что он планирует включить большую часть того, что было сделано в рабочем проекте XSLT 1.1, в XSLT 2.0, и поэтому в данной книге я кратко рассмотрю рабочий проект XSLT 1.1. Я обязательно отмечу материал как «только для рабочего проекта XSLT 1.1» при обсуждении нового материала, представленного в рабочем проекте XSLT 1.1.

    Ниже перечислены изменения в XSLT 1.0, сделанные в рабочем проекте XSLT 1.1; заметьте, что этот список приведен здесь только в качестве справочного материала, так как большая часть материала вряд ли пока что-нибудь для вас значит:

    • исключен поддерживаемый в XSLT 1.0 тип данных фрагмента результирующего дерева;

    • метод вывода больше не может произвольно добавлять узлы пространства имен, поскольку процесс установки пространства имен применяется автоматически;

    • была добавлена поддержка для XML Base;

    • теперь поддерживаются несколько выходных документов при помощи элемента

    • функции расширения теперь можно определять при помощи функции

    • функции расширения теперь могут возвращать внешние объекты, не соответствующие никаким типам данных XPath.

    В этой книге рассматривается рекомендация XSLT 1.0. а также рабочий проект XSLT 1.1. В развитие данной темы W3C и выпустил требования для XSLT 2.0, которые также рассматриваются в книге под именем XSLT 2.0. В следующем списке приведен обзор целей XSLT 2.0:

    • добавить дополнительную поддержку для работы с содержимым схемы XML при помощи XSLT;

    • упростить работу со строками;

    • упростить работу с XSLT;

    • улучшить поддержку различных языков;

    • сохранить обратную совместимость с XSLT 1.0;

    • поддерживать повышенную эффективность процессора.

    Хотя XSLT 2.0 еще некоторое время не будет выпущен в окончательном варианте, я рассмотрю все, что о нем известно, при обсуждении имеющих к нему отношение тем. Например, разработанный W3C последователь HTML — это основанный на XML язык XHTML. В XSLT 1.0 и в рабочем проекте XSLT 1.1 нет прямой поддержки преобразований из XML в XHTML, поэтому нам придется создать это преобразование с нуля. Однако такая поддержка входит в состав XSLT 2.0, и я отмечу этот факт при обсуждении XHTML.

    Таким образом, мы рассмотрели краткий обзор тематики; давайте перейдем к работе. XSL предназначен для работы с документами XML, поэтому сначала я хочу рассмотреть структуру документов XML. Вы будете работать с документами XML, но сами таблицы стилей XSL также являются документами XML, что следует помнить при их написании. В этой книге считается, что вы обладаете знаниями и XML, и HTML.

    Документы XML

    Вы должны понимать, как работают документы XML, поэтому проверьте по материалам этого раздела, готовы ли вы к работе. Давайте посмотрим на примере документа XML:

    Ulric Wilfred’s wiki

    Let the wiki begin.

    Облако тегов

    Дерево навигации

    Системные страницы

    Добавить страницу

    (X-Task: «On your Client! Get XML! Get XSL! Do XHTML! Go!»)

    Вступление

    Статья рассматривает преобразование XML в XHTML посредством XSLT на клиенте средствами JavaScript. К примеру, у вас есть какие-либо данные в виде XML, а вам требуется по какому-либо действию клиента (по клику на ссылке), оформить их в [X]HTML и динамически вставить в страницу. Это не так сложно, но по пути, как оказалось, встречается несколько подводных камней — в основном, относительно кросс-браузерности этого подхода и малой освещённости процесса в сети. Генерация XHTML-страниц средствами браузера (прямой запрос на XML файл, содержащий информацию о стиле) — это другая тема, она намного проще, и здесь затронута не будет.

    Задача будет рассмотрена на банальном примере личного сайта. Дано: Файл с контактными данными (XML), некая главная страница (XHTML) и пять браузеров: Firefox 3, Opera 9.5, IE7, Safari 3, Google Chrome. На главной странице есть ссылка, при нажатии которой контактные данные преобразуются в несортированный список (UL) и отображаются в специально выделенной области прямо на этой странице. Это реальный рабочий пример, который я сейчас использую для создания своего сайта (ещё не выложенного).

    Контактные данные, при их большом количестве, можно сгруппировать, поэтому XML-схема построена с учётом группировки элементов. Группа имеет краткое имя (shortname) для создания id у списка (возможно, потребуется оформить каждую группу по-особому) и, собственно, имя группы. XML-файл может содержать contact-ноды и вне групп, но в данном примере в этом нет необходимости. Все контакты имеют тип (type) для создания корректных ссылок в будущем (это мы также опустим). С остальным, вроде бы, всё понятно:

    Структура довольно-таки проста, поэтому приведу сразу пример файла (любое сходство с реальными данными какого-либо индивидуума полностью случайно и приведено не намеренно):

    Стиль генерирует XHTML-код, в виде списка UL, состоящего из негруппированных контактов и вложенных списков для групп. Поскольку результат вывода именно X HTML, требования к оформлению результата несколько строже, чем если бы это был обычный HTML. Поэтому следует обратить внимание на следующие моменты:

    • Важно: В результате преобразования должен получаться файл с одной и только одной корневой нодой, иначе Safari и Google Chrome (Читай: WebKit) не смогут добавить результирующий элемент в документ. Это довольно разумно, поскольку для всех XML объектов (результат в виде XHTML из их числа) есть правило: корневой элемент должен быть только один (There can be the only one).
    • Важно: В качестве xsl:output method должен быть указан либо xml либо html (однако, в последнем случае, при использовании пронстранств имён, таковые будут потеряны). Некоторые ставят это значение в xhtml и в результате получают некорректную обработку или ошибки на клиенте — пока этого метода не введено и не следует его использовать. Для этого есть media-type.
    • Код генерируется без заголовков XML: omit-xml-declaration установлен в yes и xmlns не указывается, иначе в результате получится недоXHTML-файл с XML-заголовком, не содержащий html, head и body. Генерация DOCTYPE (doctype-system, doctype-public) также отключена.

    В результате преобразования получается такой блок XHTML:

    JavaScript

    Настало время выполнить само преобразование на стороне клиента. В этом абзаце придётся использовать немного больше хитростей, ввиду того, что каждый браузер предлагает это делать по-своему.

    Загрузка XML-файлов

    Для начала нам потребуется загрузить оба файла — XML и XSLT. По своей природе они оба — файлы XML, Internet Explorer предоставляет для этих целей ActiveX-объект XMLDOM, Firefox и Opera — фунцию createDocument, позволяющую загрузить XML-файл в созданный объект. Safari и Chrome (Читай: WebKit), однако, предоставляя эту же функцию, возвращают объект, не поддерживающий загрузку — опять же, вполне разумно, в соответствии со спецификациями W3C.

    Метод 1. XMLHttpRequest

    Поэтому, плюнув на всё, мы можем загружать файлы через XMLHttpRequest (синхронный или нет — по вашему выбору), используя всем известный шаблон AJAX.

    Предложу вам свою версию, вы же можете использовать какую только заблагорассудится. Моя версия отличается тем, что принимает в параметры функцию, которая будет вызвана при успешном завершении вызова, позволяет делать и POST и GET запросы, позволяет передавать объекты и позволяет делать синхронный вызов (тогда она возвращает объект по его завершению).

    При использовании этого метода, функция загрузки XML будет выглядеть довольно просто — например, так:

    Метод 2. В зависимости от браузера

    Однако, если вы хотите использовать именно те способы, которые (как ни забавно) рекомендуются на W3Schools, функцию loadXML придётся усложнить, потому что приведённые на W3Schoolds примеры не работают на браузерах WebKit (Читай: Safari и Chrome). Пусть это будет, так сказать, «рекомендованный вид». Подозреваю, правда, что все эти обходы скрывают под собой те же вызовы XMLHttpRequest, поэтому, если вы не сторонник неоправданных действий, пропустите этот раздел.

    Итак, функция будет делать прямой синхронный вызов XHMHttpRequest (вернее, функции описанной в предыдущем разделе) только в случае вызова из Safari, в остальных же случаях прибегать к средствам конкретного браузера (Не забываем правило: Никаких прямых проверок браузера, только проверка, поддерживается ли вызываемая функция):

    В результате, функция возвращает XML-объект по заданному имени файла. Можно приступать собственно к трансформации.

    Преобразование через XSLT

    Преобразованием будет заниматься ещё одна функция, которая будет принимать в качестве аргументов пути к XML-файлу и XSL-файлу. Загружать эти файлы она будет описанной выше функцией loadXML. А возвращать эта функция будет строку с XHTML-кодом, который можно будет вставить прямо в innerHTML нужного элемента.

    Почему строку? Потому что метод transformFragment объекта XSLTProcessor не поддерживает рендеринг XML (xsl:output method="xml"), а поддерживает только HTML (xsl:output method="html"). В результате преобразования с xsl:output method="xml" и transformFragment генерируется корректный DocumentFragment, который, однако, при вставке в XHTML-код действует как некая XML-нода — поэтому визуально виден только, так называемый, plain text. Если вас не смущает потеря пространств имён, вы можете изменить xsl:output method на html и использовать transformFragment, добившись в результате, чтобы функция возвращала DocumentFragment.

    В случае Internet Explorer используется функция transformNode XML-объекта, в остальных браузерах используется XSLTProcessor.

    Всё, весь необходимый код готов и вы можете использовать функцию getStylingResult для преобразования XML-файлов и вставки результата в XHTML. Например, таким образом:

    Как итог, мы получили действительно кросс-браузерную версию обработки XML на клиенте. Спасибо за внимание.

    Илон Маск рекомендует:  Использование IP-телефонии для создания конкурентных преимуществ
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL