Преобразование XML_документа с помощью XSLT. Создание отчетов на основе xsl-трансформаций (xslt)

12.07.2019

Альтернативное введение в использование XSL Transformations в PHP при помощи Sablotron.

Данный материал следует воспринимать как альтернативное введение в использование XSLT с Sablotron в PHP.

Термины XSL и XSLT близки друг к другу, и новичкам их можно считать синонимами. Подробности, в чём же различия, описаны в спецификации XSL Transformations W3C.

Все, кто интересовался возможностями XSLT, читал стандартный пример из мануала, либо примеры, приводимые в статьях, посвящённых XSLT, на разных сайтах. Работающий пример из этой же серии:

Railroad Tycoon II Platinum экономическая стратегия PopTop software G.O.D. games 2001 Grand Prix 4 автосимулятор Geoff Crammond & Simergy Infogrames Entertainment 2002 "; $xslData = " Игры

Игры

Название жанр год разработчик издатель
"; $xh = xslt_create(); $arguments = array("/_xml" => $xmlData, "/_xsl" => $xslData); $result = @xslt_process($xh, "arg:/_xml", "arg:/_xsl", NULL, $arguments); if ($result) print ($result); else { print ("There was an error that occurred in the XSL transformation...n"); print ("tError number: " . xslt_errno($xh) . "n"); print ("tError string: " . xslt_error($xh) . "n"); exit; } ?>

Подобных примеров в Сети полно. Все они хорошо показывают, что XSL-трансформация в php работает, но после их прочтения остаётся неясным, зачем XSL нужен, скорее даже наоборот - почему XSL не нужен.

"Действительно", - подумает читатель, - "если данные лежат в базе, зачем городить огород, формируя сперва XML, а затем ещё преобразовывать через XSL? С тем же успехом это сделает класс HTML-шаблона."

После этого разочарованный программист напрочь теряет интерес к XSL и вешает на технологию ярлык "ненужная заумь".

Вам, уважаемые читатели, повезло найти такой замечательный сайт, как "php в деталях". Здесь вы прочитаете о том, что XSL может не только преобразовывать XML в HTML, но и то, как можно при помощи XSL облегчить работу с php-скриптами.

Начало работы

Приведённый выше пример, хоть и слишком прост, хорошо иллюстрирует, каким образом делается XSL-преобразование в php.

Чтобы этот код работал, нужно установить XSLT-процессор Sablotron. На виндовой машине это делается так:

1. положить iconv(-1.3).dll, expat.dll и sablot.dll в C:windowsSystem (все файлы есть в стандартном дистрибутиве php)
2. открыть C:windowsphp.ini и в нём найти параметр extension_dir. Если значение параметра - "." или нечто вроде "./", исправить на, скажем, "f:usrlocalphpextension" (или адрес директории, в которой у вас лежат/будут лежать расширения php). Теперь это будет директория расширений php.
3. положить в директорию расширений файл php_xslt.dll (это для php версии 4.2.x), либо php_sablot.dll (для версии 4.0.x)
4. в php.ini раскомментируйте строчку extension=php_xslt.dll (4.2.x) или extension=php_sablot.dll (4.0.x)

Теория

Использование XSLT позволяет отделить от php-скриптов работу по форматированию и представлению данных. Это не только уменьшение объёма кода, но и вынос большого количества логических конструкций (if, else, switch), а следовательно, облегчение работы по написанию и отладке программ. Смею утверждать, что тот, кто не пробовал работать с XSLT, не представляет себе, насколько php-кодирование облегчится.

Впрочем, не надо обольщаться: если у вас было несколько конструкций if … else в php-скрипте, они, скорее всего, появятся в том же количестве в XSL-файле.

Теперь к примерам.

Вывод списков

Все усложнения, происходящие от необходимости выводить список в удобочитаемом виде, переносятся на плечи XSL. Пример #2. Список статей на сайте с подсветкой статьи, которую читают сейчас, чередование цвета в строках и нумерация списка.

2002-05-30 Ловля ошибок в PHP Живой проект и мёртвый журнал Работа с MySQL. Часть 7. Деревья Ручная сортировка в веб-интерфейсе Как поладить дизайнеру с программистом Relax this is PHP

...

... #cccccc <

Произвольная разметка

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

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

1. тег xsl:value-of выводит текст, но удаляет все теги в абзаце
2 .тег xsl:copy-of выводит копию всего содержимого (без возможности применять шаблоны к детям - внутренним тегам) и самого контейнера (что не очень красиво в HTML).
3. наконец, xsl:apply-templates применит шаблоны к детям, но пропустит текст

Проблема кажется безвыходной, но решение есть. Я использую "магические" шаблоны, которые выводят и текст и теги в нём со всеми атрибутами и без изменений. Пример #3:

Данный пример использует магические шаблоны для разбора произвольной разметки. Это позволяет избежать таких жалоб: Люди, памажите сами мы не местные! Не могу вывести теги в тексте при помощи value-of!


Запомните эти шаблоны раз и навсегда! Тогда вы сможете обрабатывать любой текст Почти любой.

Первым делом XSLT-процессор при вызове инструкции apply-templates ищет шаблон для каждого элемента. Для элемента strong шаблон есть, и именно в соответствии с ним такие элементы будут обработаны. Для гиперссылки шаблона нет, поэтому она будет выведена, как есть. Можно добавить в XSL шаблон и для ссылки, который бы выводил рядом с каждой текстовой ссылкой картинку для открытия её в новом окне:

* в шаблоне использован параметр match="a[@href]" - этот шаблон будет применён только к тем тегам ссылок, в которых есть поле href и пропустит якоря ().

Невалидный код и

Кажущаяся необходимость писать валидный XML-код так же отпугивает многих неофитов XSLT. Хорошо, с завтрашнего дня будем писать статьи только валидно, благо дома можно проверить, нет ли в тексте XML-ошибки - mismatched tag или invalid token, - с этим как-нибудь справимся. Но ведь, по-хорошему, нужно и весь архив перевести в валидный код! И я так тоже думал, когда появилась возможность переделывать сайт на XML.

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

Что касается, то здесь дела такие: элемента nbsp в XML нет. Есть lt, gt, quot, но не nbsp (вполне логично - это ведь non-braking space, который относится к форматированию и придуман для HTML). Поэтому его нужно объявить в документе, либо использовать только внутри .

Пример #4:

Люди, памажите, сами мы не местные!


Запомните и эти шаблоны тоже!

Очень удобно! Большие изменения в архив вносить не придётся. Можно начать писать валидно, а продолжать как попало. А можно комбинировать эти два подхода. Чтобы не писать в архивные файлы тег CDATA, я сделал простое преобразование при помощи регулярных выражений (важно так же помнить, что один тег CDATA не должен содержать в себе другой).

$doc = preg_replace("~<(p|h|pre)>(.*?)~", "<\1>\2", $doc);

Циклы

Допустим, нам нужно сделать форму для редактирования статьи, в том числе её даты. Для удобства пользования надо сделать три раскрывающихся списка (далее - "крутилки") - дата от 1 до 31, месяц, год. Первое решение, которое приходит в голову - сделать HTML-код крутилок в php, вставить в XML в контейнере CDATA, а затем вывести в XSL с параметром disable-output-escaping="yes".

На самом деле, XSLT может и это. Достаточно вставить в данные XML число, номер месяца и год. Крутилки можно нарисовать сразу в XSLT.

Напишем шаблон, не предназначенный ни для какого элемента документа. Он будет вызываться командой xsl:call-template и получать два параметра: значение счётчика и максимум. Сперва он будет выводить нужные нам данные со значением счётчика, затем вызывать самого себя с параметрами максимум и счётчик, увеличенный на 1. Пример #5:

Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь

... 7 10 2002

... ...

Оставляю вам в качестве домашнего задания шаблон для вывода крутилки с годом.

Рассмотрим типичный пример рендеринга 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 очевидна на практике:

    XSLT-шаблон:

  • Полученный HTML:

  • Антонио Вивальди - Времена года. Лето. Шторм
  • Как видно из примера выше, отсутствие элемента 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 .

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

    ]>

  • even odd

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

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

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

    • Рихард Вагнер - Полёт валькирии - 280
    • Антонио Вивальди - Времена года. Лето. Шторм - 203
    • Иоган Бах - Токката и фуга ре-минор - 187
    • Эдвард Григ - В пещере горного короля - 163
    • Джузеппе Верди - Триумфальный марш (Аида) - 103

    ]>

    ]>

  • Как видно из кода, первый вариант короче и проще, но он нарушил принцип разделения ответственности для шаблонов. Теперь шаблон 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 стоит уделять особое внимание сопровождаемости шаблонов.

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

    После того как вы загрузили, выполнили синтаксический разбор или каким_то другим способом получили объект Document, представляющий XML_документ, одно из самых интереснейших действий, которые можно с ним выполнить, – это преобразовать документ с помощью таблицы XSLT_стилей. Аббревиатура XSLT происходит от XSL Transformations (XSL_преобразования), а XSL – от Extensible Stylesheet Language (расширяемый язык таблиц стилей). Таблицы XSL_стилей – это XML_документы, которые могут быть загружены и разобраны, как и любые другие XML_документы. Изучение XSL далеко выходит за рамки темы этой кни_ ги, тем не менее в примере 21.8 демонстрируется таблица стилей, которая может использоваться для преобразования в HTML_таблицу XML_документа, подобно_ го представленному в примере 21.6.

    Пример 21.8. Простейшая таблица XSL"стилей


    21.3. Преобразование XML*документа с помощью XSLT

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    ИмяЭлектронная почта

    ... __>

    Когда встретится элемент , вывести его содержимое в другую ячейку __>

    Правила в таблицах XSL_стилей используются для XSLT_преобразований XML_ документов. В контексте клиентского JavaScript_кода это обычно означает пре_ образование XML_документов в HTML_документы. Многие архитектуры разра_ ботки веб_приложений используют XSLT на стороне сервера, но броузеры на ба_ зе Mozilla и броузеры линейки IE поддерживают XSLT_преобразования на сторо_ не клиента, что может помочь снизить нагрузку на сервер и объем трафика, пе_ редаваемого по сети (потому что формат XML, как правило, более компактный, чем HTML).

    Многие современные броузеры позволяют определять XML_стили с помощью таблиц CSS_ или XSL_стилей. Если определить таблицу стилей в исполняемой инструкции xml_stylesheet, тогда можно загрузить XML_документ непосредст_ венно в броузер, а броузер преобразует и отобразит его. Например, исполняемая инструкция могла бы выглядеть примерно так:

    Обратите внимание: броузеры выполняют такого рода XSLT_преобразования ав_ томатически, когда XML_документ, содержащий соответствующую исполняе_ мую инструкцию, загружается в окно броузера. Это очень важно и очень удобно, но не это является темой данного раздела. Дальше я расскажу о том, как с помо_ щью JavaScript выполнить динамическое XSLT_преобразование.

    Консорциум W3C не определяет стандартного прикладного интерфейса для XSLT_ преобразований DOM_объектов Document и Element. В броузерах на базе Mozilla прикладной интерфейс для XSLT_преобразований в JavaScript представляет объект XSLTProcessor. В IE XML_объекты Document и Element имеют метод transform_


    530 Глава 21. JavaScript и XML

    Node(), выполняющий преобразования. В примере 21.9 демонстрируется исполь_ зование обоих прикладных интерфейсов. В нем определяется класс XML.Trans_ former, который инкапсулирует таблицу XSL_стилей и позволяет использовать ее для преобразования более одного XML_документа. Метод transform() объекта XML.Transformer с помощью инкапсулированной таблицы стилей выполняет пре_ образование указанного XML_документа, а затем замещает содержимое заданно_ го DOM_элемента результатом преобразования.

    Пример 21.9. XSLT в Mozilla и Internet Explorer

    * Этот класс XML.Transformer инкапсулирует таблицу XSL_стилей.

    * Если параметр stylesheet представляет собой URL_адрес, выполняется

    * на соответствующий DOM_объект Document.

    XML.Transformer = function(stylesheet) {

    // Загрузить таблицу стилей, если это необходимо.

    if (typeof stylesheet == "string") stylesheet = XML.load(stylesheet); this.stylesheet = stylesheet;

    // В броузерах на базе Mozilla создать объект XSLTProcessor

    // и передать ему таблицу стилей.

    if (typeof XSLTProcessor != "undefined") { this.processor = new XSLTProcessor(); this.processor.importStylesheet(this.stylesheet);

    * Это метод transform() класса XML.Transformer.

    * Выполняет преобразование указанного xml_узла с использованием

    * инкапсулированной таблицы стилей.

    * Предполагается, что в результате преобразования получается HTML_код,

    * которым следует заменить содержимое указанного элемента.

    XML.Transformer.prototype.transform = function(node, element) { // Если элемент указан по id, отыскать его.

    if (typeof element == "string") element = document.getElementById(element);

    if (this.processor) {

    // Если был создан объект XSLTProcessor (в броузерах на базе Mozilla),

    // использовать его.

    // Преобразовать узел в DOM_объект DocumentFragment.

    var fragment = this.processor.transformToFragment(node, document);

    // Стереть существующее содержимое элемента. element.innerHTML = "";

    // И вставить преобразованные узлы. element.appendChild(fragment);

    else if ("transformNode" in node) {

    // Если узел имеет метод transformNode() (в IE), использовать его.

    // Обратите внимание: transformNode() возвращает строку. element.innerHTML = node.transformNode(this.stylesheet);


    // В противном случае удача отвернулась от нас.

    throw "XSLT не поддерживается в этом броузере";

    * Эта вспомогательная функция, выполняющая XSLT_преобразование,

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

    XML.transform = function(xmldoc, stylesheet, element) {

    var transformer = new XML.Transformer(stylesheet);

    transformer.transform(xmldoc, element);

    К моменту написания этих строк IE и броузеры на базе Mozilla были единствен_ ными из основных броузеров, предоставляющих API для XSLT_преобразований. Если для вас важно иметь поддержку и в других броузерах, вас наверняка заин_ тересует проект AJAXSLT – свободно распространяемая JavaScript_реализация XSLT_преобразований. Разработка проекта AJAXSLT была начата компанией Google, ознакомиться с ним можно на сайте проекта по адресу http://goog" ajaxslt.sourceforge.net .

    XSLT (eX tensible S tylesheet L anguage T ransformations) - язык преобразований xml-документов.

    Введение

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

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

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

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

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

    Xml-данные для отчета

    Xsl-шаблон отчета

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

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

    Select Analit, -- ИД записи для генерации ссылки NameAn, -- Наименование контрагента EdIzm, -- ИНН Dop2 -- Адрес from dbo.MBAnalit where Vid = %s and Sost = "Д" and XRecStat = "+" for xml path("org"), type -- Получить набор строк в виде xml

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

    101702Мобил-Авто ООО123456789 148965ОАО Тринити631000001 148966ООО Дальний восток011101001

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

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

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

    101702Мобил-Авто ООО123456789426000, г. Ижевск, ул. Революционная, 44 148965ОАО Тринити631000001443000, Самарская обл., г. Самара, ул. Ленина, 11 148966ООО Дальний восток011101001100006, г. Владивосток, ул. Первая, 1

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

    xsl-шаблон

    Список контрагентов

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

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


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

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

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


    Сортировка

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

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


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

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

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


    Гиперссылки

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


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

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

    ИНН:. ИНН не указан.

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


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

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

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

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

    Список контрагентов

    ИНН:. ИНН не указан. Адрес: .


    Результат

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

    Вывод

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

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

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

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

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

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

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

    XSLT обладает большими возможностями для оперирования данными в документах XML. Например, при помощи таблицы стилей (stylesheet) XSLT я мог бы отформатировать данные из planets.xml в таблицу HTML. Таблицы стилей содержат правила, установленные для преобразования XML-документа, и большая часть книги посвящена созданию таблиц стилей и объяснению того, как они работают. Вот как выглядит таблица стилей XSLT planets.xsl (листинг 1.2), преобразующая данные из planets.xml в таблицу HTML (мы проанализируем ее в главе 2).

    Листинг 1.2. planets.xsl

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    The Planets Table

    The Planets Table

    Как видите, эта таблица стилей XSLT выглядит как XML-документ - и для этого есть основания, потому что она им и является. Все таблицы стилей XSLT являются также и документами XML, а раз так, то они должны быть хорошо форматированными документами XML С этими двумя документами - planets.xml (листингом 1.1) и связанной с ним таблицей стилей, planets.xsl (листинг 1.2) - мы будем работать на протяжении всей книги, рассматривая различные возможные преобразования XSLT.

    Как вы свяжете эту таблицу стилей с XML-документом planets.xml ? Как мы увидим в следующей главе, одним из способов это сделать является инструкция обработки XML , использующая два атрибута. Первый атрибут - type , который следует установить в «text/xml», чтобы указать, что используется таблица стилей XSLT. (Чтобы использовать таблицы стилей другого типа - каскадирующие таблицы стилей (CSS, cascading stylesheets), обычно использующиеся с HTML - следует задать «text/css».) Второй атрибут - href , которому следует присвоить значение URI (вспомните, что XML использует не адреса URL, а идентификаторы URI, Uniform Resource Identifier) таблицы стилей:

    Mercury

    .0553

    58.65

    1516

    .983

    43.4

    Теперь при помощи процессора (processor) XSLT можно применить таблицу planets.xsl к planets.xml и создать новый документ, planets.html . Процессор XSLT создает новый файл planets.html , который вы можете увидеть на рис. 1.2.

    Рис. 1.2. HTML-документ, созданный процессором XSLT

    Как можно видеть на рис. 1.2, процессор XSLT считывает данные из planets.xml , применяет к ним правила из planets.xsl и создает HTML-таблицу в planets.html. Это наш первый пример XSLT-преобразования.

    Что здесь на самом деле происходит? У нас были XML-документ, planets.xml , и таблица стилей XSLT, planets.xsl . Но каким образом они объединились для создания planets.html ?

    Из книги XSLT автора Хольцнер Стивен

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

    Из книги Технология XSLT автора Валиков Алексей Николаевич

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

    Из книги автора

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

    Из книги автора

    Что нужно для XSLT-преобразования Для осуществления XSLT-преобразования, такого как преобразование planets.xml в planets.html, необходим XSLT-процессор. Для преобразований документов XML можно использовать XSLT тремя способами: используя отдельные программы, называемые процессорами XSLT.

    Из книги автора

    XSLT-преобразования на web-серверах Можно осуществлять XSLT-преобразования на web-сервере - так чтобы XML-документ был преобразован до того, как web-сервер отправит его браузеру. Здесь самое распространенное преобразование - это преобразование документа XML в HTML, но

    Из книги автора

    Ресурсы XSLT В Интернете можно найти огромное количество нужных нам сведений. Имейте в виду, что все приведенные далее адреса URL легко могут измениться; списки будут актуальны столь долго, сколько этого будут хотеть люди, занимающиеся поддержкой перечисленных

    Из книги автора

    Утилиты XSLT В Интернете существует также много утилит XSLT - в следующем списке перечислены наиболее известные: Microsoft XSL API Extension, http://msdn.microsoft.com/downloads/webtechnology/xml/xslisapi.asp. Упрощает задачу выполнения XSLT-преобразований на стороне сервера; Microsoft XSL-to-XSLT Converter,

    Из книги автора

    Инструкции XSLT В теле шаблона может присутствовать ряд элементов XSLT, называемых инструкциями: ; ; ; ; ; ; ; ; ; ; ; ;

    Из книги автора

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

    Из книги автора

    Из книги автора

    Отличия XSLT 1.1 от XSLT 1.0 Отсутствие result tree fragment Главное и наиболее существенное отличие XSLT 1.1 от XSLT 1.0 состоит в том, что тип данных, известный в XSLT 1.0 как result tree fragment (результирующий фрагмент дерева) в XSLT 1.1. отсутствует. Вместо него в версии 1.1 используется множество узлов,

    Из книги автора

    Отличия XSLT 2.0 от XSLT 1.1 Прежде чем приступить к описанию отличий второй версии XSLT от версии 1.1 (и, соответственно, 1.0), следует сделать одно существенное замечание. Лицензионные соглашения Консорциума W3 не позволяют раскрывать широкой общественности внутренние материалы

    Похожие статьи
     
    NameMassRadiusDay