Что такое код xsl


Содержание

Введение в XSL(T)

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

Введение

Что такое XSL(T)?

XSL(T) это аббревиатура от Extandable Stylesheet Language (Transformation) (Расширяемый язык таблицы стилей (Трансформации)). Хотя это и таблица стилей, но она преследует другие цели, нежели CSS. XSL(T) не используется для визуальных эффектов, вместо этого она используется для извлечения (преобразования) данных из XML для представления их с помощью HTML и CSS. Так же в XSL(T) есть динамические свойства, в которых вы можете использовать итерации или операции сравнения в отличии от статичного XML файла.

Почему использовать XSL(T)?

XSL(t) служит для организации огромных XML деревьев так, чтобы каждый смог их прочитать. К примеру сервера поисковых систем Google’а предоставляют запросы как XML. Чтобы обычный пользователь смог прочитать данный запрос, с ним необходимо провести некоторые преобразования. Вот где XSL(T) играет важную роль. Эту технологию так же можно использовать для представления данных как RSS, когда источник весь на XML. Еще XSL(T) используется как основной язык шаблонов для автономных командных проектов (EMC) и в некоторых открытых CMS, как Symphony.

XSL(T) так же снижает нагрузку на сервер. Из-за того что XSL(T) будет выполнятся на стороне клиента, у сервера уменьшиться количество работы. JavaScript и инструкции на сервере могут указывать на использование конкретного XSL(T) шаблона, или можно из шаблона обратиться к самому XML-файлу. В этом руководстве для простоты мы свяжем XSL(T) шаблон с XML файлом.

Давайте начнем

Создание xsl(t) файла

Если мы хотим, чтобы представление наших данных использовало XHTML по стандартам W3C, мы должны подключить doctype. В нашем примере мы будем использовать XHTML Strict DTD. Для этого используется тэг xsl:output.

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

Итерация (цикл) —

Сортировка

Предварительный просмотр

Параметры: выборка и сравнение (проверка)

Что у нас получилось.

На этот раз мы увидим в браузере что-то полезное, откройте trips.xml:

XSL(T) — мощное средство, с которым вы радикально измените представление данных из XML.

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Способ: использование преобразований XSLT с файлами обмена данных XML проекта How to: Use XSLT Transformations with Project XML Data Interchange Files

Таблица стилей преобразования (XSLT) standard указывает определение языка для преобразования XML-данных. The Extensible Stylesheet Language Transformation (XSLT) standard specifies a language definition for XML data transformations. XSLT используется для преобразования XML-документов в документы XHTML или в других XML-документов. XSLT is used to transform XML documents into XHTML documents, or into other XML documents. В этой статье показано, как использовать XSLT с помощью Microsoft Office Project 2007 XML обмена данными файлов для фильтрации и отображения сведений о проекте. This article shows you how to use XSLT with Microsoft Office Project 2007 XML Data Interchange files to filter and display project information. (Сведения в этой статье был предоставили Джессика Britton корпорации Майкрософт.) (The content of this article was contributed by Jessica Britton, Microsoft Corporation.)

Сведения о сохранении проекты в виде обмена данными Project XML-файлов можно Сохранение и открытие проектов в формате XML. For information about saving projects as Project XML Data Interchange files, see Saving and Opening Projects in XML Format.

Таблицы стилей XSLT — это XML-документ, состоит из комбинации XHTML разметки, правила шаблона XSLT и XPath операторов, которые работают вместе. An XSLT stylesheet is an XML document that consists of a combination of XHTML markup, XSLT template rules, and XPath statements that work together.

Разметка XHTML определяет среды отображения, представленных в XML-данных. XHTML markup defines the display environment that XML data is presented in.

Правила шаблона XSLT предоставлены инструкции для преобразования XML-элемент источника определенным образом. XSLT template rules provide instructions for transforming a source XML element in a particular way.

Операторы XPath определите определенных элементов XML-документа. XPath statements identify specific elements within an XML document.

При XML-элемент соответствует шаблону XPath, вызывается связанного шаблона правила преобразования XSLT. When an XML element matches an XPath pattern, the associated XSLT template rule is invoked. Преобразованные данные выводятся в платформе отображения, указанный с помощью разметки XHTML. The transformed data is then rendered in the display framework specified by the XHTML markup.

Дополнительные сведения о правилах шаблон XSLT и XPath операторов воспользуйтесь ссылками в конце этой статьи. For more information about XSLT template rules and XPath statements, see the links at the end of this article.

Отображение сведений о проекте с помощью XSL-преобразований Displaying Project Information by using XSLT Transformations

Процедура 1. Procedure 1. Чтобы создать таблицу стилей XSLT: To create an XSLT stylesheet:

Создание файла XSLT для вашей таблицы стилей. Create an XSLT file for your stylesheet. При работе в Microsoft Visual Studio 2005 можно использовать шаблон XSLT-файл (в Visual Studio откройте меню файлвыберите команду Создатьи выберите пункт файл. If you are working in Microsoft Visual Studio 2005, you can use the XSLT File template (in Visual Studio, click File, point to New, and then click File. Этот шаблон предварительно заполняется в XML-коде показано в следующем примере. This template is prepopulated with the XML code shown in the following example. Если вы работаете в качестве другого текстового или XML-редактора, скопируйте этот шаблон XML и вставьте его в XSLT-файл. If you are working in another text or XML editor, copy this template XML and then paste it into your XSLT file.

Удалите следующий XML-код комментарии. Delete the following XML code comment. Здесь указывается, где написании кода XSLT. This is where you write your XSLT code.

Создание кода XSLT. Create your XSLT code. Код XSLT, показано в следующем примере выполняет следующие действия. The XSLT code shown in this example does the following:

Отображает текстовое значение имя дочернего элемента проекта в заголовок. Displays the text value of the Name child of the Project element in a header.

Проверяет сводки дочерним элементом каждой задачи для просмотра, если значение равно 0 (false). Tests the Summary child of each Task element to see if the value is 0 (false).

Проверка важных дочерних каждого элемента задачи для просмотра, если значение равно 1 (true). Tests the Critical child of each Task element to see if the value is 1 (true).

Отображает данные для особо важные задачи, которые не являются суммарными задачами полужирным шрифтом. Displays data for critical tasks that are not summary tasks in bold.

Отображает данные для некритические задачи, которые не являются суммарными задачами. Displays data for noncritical tasks that are not summary tasks.

Сортировка сведения о ресурсах по текстовое значение дочернего имя для каждого элемента ресурсов. Sorts resource information alphabetically by the text value of the Name child of each Resource element.

Проверяет дочернего превышение доступности для каждого элемента ресурсов является ли значение 1 (true). Tests the Overallocated child of each Resource element to see if the value is 1 (true).

Отображение сортированных ресурсе только с превышением доступности ресурсов. Displays sorted resource data for only overallocated resources.

Сохраните файл как ProjectTransform.xslt. Save the file as ProjectTransform.xslt.

После создания таблицы стилей XSLT, необходимо связать файл XML для проекта к нему, добавив инструкции по обработке. After you create the XSLT stylesheet, you must link your Project XML file to it by adding processing instructions. Процедура 2 показано, как связать ProjectTransform.xslt файл, созданный в процедуру 1 для всех файлов XML для проекта. Procedure 2 shows you how to link the ProjectTransform.xslt file created in Procedure 1 to any Project XML file.

Процедура 2. Procedure 2. Чтобы изменить файл XML для проекта для использования таблицы стилей XSLT: To modify the Project XML file to use the XSLT stylesheet:

Откройте файл XML для проекта в Visual Studio или в другом текстовом редакторе или редакторе XML. Open a Project XML file in Visual Studio, or in another text or XML editor.

Вставьте следующую строку кода после объявления XML — это первая строка в проект XML-файл. Insert the following line of code after the XML declaration, which is the first line in the Project XML file.

Удалите объявление пространства имен XML из внутри элемента проекта, который представляет собой корневой элемент проекта XML-файла. Delete the XML namespace declaration from inside the Project element, which is the root element of the Project XML file. Если не удаляйте объявление пространства имен, встроенного в элемент проекта, операторы XPath завершится с ошибкой в соответствии с элементами в проект XML-файл. If you do not delete the namespace declaration that is embedded in the Project element, XPath statements will fail to match elements in the Project XML file.

После выполнения действия 2 и 3, первые три строки проект XML-файл должен выглядеть как в следующем примере кода. After you perform Steps 2 and 3, the first three lines of your Project XML file should look like the following code example.

Сохраните файл XML для проекта. Save the Project XML file.

Мы рекомендуем сохраните файл с именем файла, отличный от исходное имя файла XML для проекта, так как изменения, внесенные в шаге 3 разорвать связь проекта XML-файла из проекта данных Interchange схемы XML. We recommend you save the file by using a file name that is different from the original Project XML file name, because the changes made in Step 3 disassociate the Project XML file from the Project XML Data Interchange Schema.

Просмотр преобразованный файл XML для проекта. View the transformed Project XML file. Можно выполнить преобразования XSLT в Visual Studio, установив таблицы стилей проекта XML-файла для ProjectTransform.xslt и затем выбрав команду Показать вывод XSLT в меню XML . You can perform the XSLT transformation in Visual Studio by setting the Stylesheet property of the Project XML file to ProjectTransform.xslt, and then selecting Show XSLT Output from the XML menu.

Можно также открыть проект XML-файл в Internet Explorer 7, Microsoft Office Word 2007 или любого другого приложения, поддерживающего XSLT. You can also open the Project XML file in Internet Explorer 7, Microsoft Office Word 2007, or any other application that supports XSLT.

На рисунке 1 показано преобразованные выходные данные проекта XML-файла в Word 2007. Figure 1 shows the transformed output of a Project XML file in Word 2007. При открытии файла XML для проекта по умолчанию только данные представления данных отображается. When you open the Project XML file, by default the Data only data view is displayed. Чтобы просмотреть преобразованные выходные данные необходимо выбрать представление данных ProjectTransform.xslt в области XML-документа . To see the transformed output you must select the ProjectTransform.xslt data view in the XML Document pane.

Рис. 1. Figure 1. XML-файл преобразованного проекта Transformed Project XML file

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

Корневым элементом, декларирующим документ таблицы стилей XSL, является или .

Примечание: Элементы и являются полными синонимами, и для декларации таблицы стилей можно использовать любой из них!

Согласно рекомендации консорциума W3C таблица стилей XSL декларируется следующим образом:

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

Строка xmlns:xsl=»http://www.w3.org/1999/XSL/Transform» указывает на официальное пространство имен XSLT консорциума W3C. Если вы используете это пространство имен, то вы также должны указывать и атрибут version=»1.0″.

Начнем с чистого XML документа

Предположим, что нам нужно преобразовать следующий XML документ («cd_catalog.xml») в XHTML:

Просмотр XML файлов в IE, Chrome, Firefox, Safari и Opera: Откройте XML файл (нажмите на ссылку ниже) — XML документ буде отображаться в виде окрашенных в разные цвета корневого и дочерних элементов и их содержимого (кроме браузера Safari). Часто слева от элементов XML дерева выводится знак плюса (+) или минуса (-), при нажатии на который можно развернуть/свернуть структуру элемента. Чтобы просмотреть исходный код документа, нажмите правой кнопкой мыши на XML файл и в контекстном меню выберите пункт «Исходный код» (Opera) или «Просмотреть код страницы» (Chrome)!

Создание таблицы стилей XSL

Теперь создаем таблицу стилей XSL («cd_catalog.xsl») с шаблоном преобразования:

Подключаем таблицу стилей XSL к XML документу

Добавляем ссылку на таблицу стилей XSL в XML документ («cd_catalog.xml»):

Если вы используете XSLT совместимый браузер, то вы увидите корректно преобразованный из XML в XHTML документ.

Язык трансформации XSL

Что такое XSL трансформация

Спецификация XSL (eXtensible Stylesheet Language) – еще один набор рекомендаций от W3C, который на этот раз представляет собой язык описания трансформации или набора преобразований данных XML документов в другие форматы. Трансформация осуществляется из одного XML формата в другой, например из документа XML, соответствующего вашей прикладной схеме в формат XML документа Microsoft Office или просто в XHTML. Возможно, также, преобразование не в расширение XML, а в любой другой структурированный формат, к примеру, в HTML (стандарты HTML и XHTML сильно похожи, но только внешне) или же просто в произвольное текстовое представление.

Слово stylesheet в названии стандарта заставляет многих проводить аналогию с другим инструментом форматирования языков разметки — CSS (Cascading Style Sheets) – каскадными таблицами стилей. Оба эти стандарты имеют из общего, скорее всего только это самое слово в названии. С использованием XSL можно добиться эффекта применения CSS, но CSS ни разу не аналог XSL. Вот их принципиальные отличия:

  • CSS оказывает влияние только на стиль представления данных HTML/XHTML, в то время, как XSL может легко изменить само их содержание.
  • CSS применяется на стороне клиента интернет браузером, а XSL может быть применен как на стороне клиента, так и на стороне сервера.
  • XSL является расширением XML, а CSS – отдельный формальный язык.

Стандарт XSL, в контексте преобразований XML в HTML, ближе по своему назначению к PHP (Hypertext Preprocessor) – скриптовому языку веб-программирования, применяемому на стороне сервера. И PHP и XSL могут существенно сократить объемы страниц интернет ресурсов, позволяя хранить только их содержимое (в базе данных или в XML файлах): без параметров стилей форматирования, самой HTML разметки, ссылок и метатегов. Более того, они могут использоваться совместно: на первом этапе средствами PHP формируется XML документ, соответствующий структуре запрашиваемой пользователем интернет страницы, а на втором этапе XSL преобразует этот XML в HTML. На завершающем этапе все это дело форматирует и “раскрашивает” браузер уже на стороне клиента по правилам, указанным в CSS. Таким образом, экономится не только место на сервере, но и объем трафика, поскольку передаются данные в оптимальном для каждого конкретного случая XML формате.

Применением XSL весьма широкое. К примеру, XSL трансформация используется для преобразования результатов запросов в контексте работы информационных систем в удобный для восприятия, печати и дальнейшей обработки вид. Далее вашему вниманию будет представлен обзор основных конструкций XSL, инструмент для отладки схем трансформации и пример преобразования XML отчета в HTML.

Илон Маск рекомендует:  Таблицы HTML


Основные элементы или синтаксис XSL

Для составления XSL преобразований необходимы знания следующих стандартов:

  1. Синтаксис или XML схема языка преобразований XSL.
  2. Язык запросов к элементам XML документа XPath.
  3. Формат целевого документа (чаще всего HTML).

С HTML многие знакомы, про XPath можно узнать, перейдя по соответствующей ссылке, а список основных элементов XSL будет представлен ниже.

Заголовок схемы XSL трансформации

Определение заголовка схемы трансформации XSL является корневым элементом соответствующего XML документа. Файлам со схемами трансформации чаще всего дают расширения .xsl. Помимо определения пространства имен xsl, заголовок схемы трансформации может содержать параметры выведения (output) результата трансформации: xml, html или text. Если элемент output не указан явно, то его параметры определяются интерпретатором по ходу разбора схемы трансформации. Параметры вывода – различные атрибуты элемента output могут влиять на форматирование конечного результата: появление дополнительных пробелом, символов перевода каретки и т.п. Я обычно не уделяю особого внимания этому элементу, поскольку в случае преобразования в XML дополнительное форматирование или его отсутствие мне не мешает, а в случае HTML его обработка — проблемы интернет браузера. С обычным текстовым форматом вывода я не сталкивался.

Шаблон XSL

Шаблон XSL используется для применения группы преобразований к определенному фрагменту XML документа. Группа преобразований помещается внутри определения шаблона, а целевой фрагмент документа отбирается посредством XPath запроса, указанного в атрибуте match. Самый распространенный вариант запроса – имя дочерних по отношению к контексту разбора элементов. Контекстом разбора до начала преобразований является сам документ и постепенно, по мере применения XSL шаблонов, контекст перемещается по структуре документа в соответствии с результатами XPath запросов. Пример шаблона ниже.

Как видно из примера, шаблон применяется к XML элементам DataSet. В результате преобразования формируется HTML заголовок с текстом, соответствующим атрибуту Caption трансформируемого элемента, создается HTML таблица и по очереди применяются к дочерним по отношению к DataSet элементам два шаблона: с запросами элементов Columns и Records. Шаблоны для обработки элементов Columns и Records должны быть определены в схеме трансформации отдельно.

Условные операторы XSL и вызов параметризованного шаблона

При должном владении XSL с его помощью можно даже писать небольшие программы. Я имею в виду не программное управление обработкой данных, а решение задач, которые вообще не связанны с их обработкой. Такие случаи, безусловно, экзотика, но в процессе обработки сложно структурированных данных без проверки условий и циклов иногда не обойтись. Спецификация XSL поддерживает условные операторы, вызовы шаблонов с передачей параметров, изменение значения параметров в соответствии с математическими выражениями и т.д. Пример шаблона с оператором выбора и условным оператором приведен ниже:

В процессе обработки элементов Column анализируется значение атрибута Name и в зависимости от его значения вызывается определенный шаблон. Шаблоны могут иметь имя, и для их вызова используется конструкция call-template. Сами шаблоны Name и AnyColumn определены в документе отдельно. Шаблон AnyColumn к тому же является параметризованным – принимает параметры выравнивания текста в ячейке таблицы. Каждый элемент when соответствует варианту выбора, а элемент otherwise – всем остальным вариантам. Полное описание примера трансформации будет приведено в следующем разделе.

В конце тела шаблона присутствует условный оператор, с помощью которого определяется вид пустой ячейки: если значение атрибута Caption – пустая строка, то выводим символ “-”. Обратите внимание, что шаблон, помимо условия выбора элементов Column содержит атрибут mode со значением Row. Атрибут mode можно использовать для различных шаблонов с одинаковым значением атрибута match. В ходе трансформации именно значение атрибута mode в конструкциях применения шаблона apply-template будет определять выбор шаблона. Вот пример.

Таким образом, если у шаблона не указано имя, то возможность его применения обусловлена контекстом трансформации в соответствии со значениями атрибута match и, дополнительно, атрибута mode. Место применения шаблона по контексту определяется конструкцией apply-template. Если шаблон имеет имя, то его можно принудительно применить к текущему контексту с использованием конструкции call-template без изменения самого контекста.

Цикл и сортировка в XSL

Язык XSL не только позволяет гибко настраивать трансформацию данных, но и проводить их предварительную сортировку. Сортировка доступна только в контексте перебора элементов, организованного циклом for-each. Какие элементы перебирать определяет атрибут select элемента for-each, а по каким данным их сортировать определяет уже атрибут select элемента sort. Значениями обоих этих атрибутов должно быть XPath выражение.

Определение параметризованного шаблона XSL и присвоение значений атрибутов

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

Обратите внимание, каким образом выходному элементу p присваивается значение атрибута align – c помощью отдельной конструкции attribute и конструкции value-of, которая обращается к значению входного параметра.

Отладчик XSL схем

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

Скачать демонстрационную программу.
Скачать пример XSL трансформации.
Скачать Microsoft .NET Framework 3.5 SP1.

Окно отладчика XSL разделено на 4 части: область редактирования XSL, область просмотра входного XML, область просмотра результата трансформации в текстовом виде HTML и область просмотра результата в интернет браузере. В качестве примера данных используется все тот же отчет, что рассматривался в ходе изучения XPath, а в качестве XSL схемы – преобразование отчета в таблицу HTML. Фрагменты этой схемы трансформации уже были представлены выше в разделе описания синтаксиса XSL. Теперь все это предстанет в виде единого документа. Вот перечень требований к результатам трансформации:

  • Список персонала должен быть отсортирован по значению Ф.И.О. в алфавитном порядке.
  • Выравнивание первой колонки по левому краю, выравнивание стажа по правому краю, выравнивание всех остальных колонок по центру.
  • Пустые значения обозначаются прочерком.

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

Пример XSL трансформации на C# можно посмотреть здесь.

Опубликовал +автор Март 07 2012 11:56:14 20042 Прочтений
Компьютерные курсы и курсы программирования

Курс для начинающих программистов на C# и VB.NET.

Построение SQL запросов и работа с базой данных.

Программирование на C#. Краткое руководство.

Применение регулярных выражений.

Примеры программной Plug-in архитектуры.

Язык разметки XML и его расширения с примерами.

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна: решения типовых задач верстки.

Руководство по программированию на PHP для начинающих.

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Стилевые таблицы XSL

В предыдущем разделе для вывода элементов XML-документа на экран броузера мы применяли Java Script-сценарии Однако, как уже отмечалось, для этих целей предпочтительней использование специально предназначенного для этого средства — стилевых таблиц XSL (Extensible Stylesheet Language).

Стилевыми таблицами (стилевыми листами) принято называть специальные инструкции, управляющие процессом отображения элемента в окне программы-клиента(например, в окне броузера). Предложенные в качестве рекомендация W3C, каскадные стилевые таблицы (CSS-Cascading Style Sheets) уже больше года используются Web-разработчиками для оформления Web-страниц.

Поддержка CSS наиболее известными на сегодняшний день броузерами Opera и Microsoft Internet Explorer (начиная с версии 3.0) и Mozilla Firefox позволила использовать стилевые таблицы для решения самого широкого спектра задач — от оформления домашней странички до создания крупного корпоративного Web-узла. Слово каскадные в определении CSS означает возможность объединения отдельных элементов форматирования путем вложенных описаний стиля. Например, атрибуты текста, заданные в тэге , будут распространяться на вложенные тэги до тех пор, пока в них не встретятся стилевые описания, отменяющие или дополняющие текущие параметры. Таким образом, использование таблиц CSS в HTML было весьма эффективно — отпадала необходимость явного задания тэгов форматирования для каждого из элементов документа.

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

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

Некоторые его отличия от CSS:

Во-первых, стилевые таблицы XSL позволяют определять оформление элемента в зависимости от его месторасположения внутри документа, т.е. к двум элементам с одинаковым названием могут применяться различные правила форматирования.
Во-вторых, языком, лежащем в основе XSL, является XML, а это означает, что XSL более гибок, универсален и у разработчиков появляется возможность использования средства для контроля за корректностью составления таких стилевых списков(используя DTD или схемы данных)
В-третьих, таблицы XSL не являются каскадными, подобно CSS, т.к. чрезвычайно сложно обеспечить «каскадируемость» стилевых описаний, или, другими словами, возможность объединения отдельных элементов форматирования путем вложенных описаний стиля, в ситуации, когда структура выходного документа заранее неизвестна и он создается в процессе самого разбора. Однако в XSL существует возможность задавать правила для стилей, при помощи которых можно изменять свойства стилевого оформления, что позволяет использовать довольно сложные приемы форматирования

В настоящий момент язык XSL находится на стадии разработки в W3C[3] и в будущем, видимо, станет частью стандарта XML. Это означает, что использование этого механизма является наиболее перспективным способом оформления XML-документов. В текущем рабочем варианте W3C, XSL рассматривается не только как язык разметки, определяющий стилевые таблицы — в него заложены средства, необходимые для выполнения действий по фильтрации информации, выводимой в окно клиента, поиска элементов, сложного поиска, основанного на зависимостях между элементами и т.д.

На сегодняшний день единственным броузером, поддерживающим некоторые из этих возможностей, является бэта-версия Internet Explorer 5.0, однако в самом ближайшем будущем, безусловно, XSL будет использоваться также широко, как сегодня стандартные тэги HTML

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

Все примеры, приводимые далее, могут быть проверены при помощи XSL-конвертора, свободно доступного на странице Mcrosoft (www.microsoft.com/xml/xsl/)

С чего начать

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

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

Рассмотрим основные структурные элементы XSL, используемые, в частности, в конверторе msxsl, для создания оформления XML-документов.

Правила XSL

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

Элементы XML, к которым будет применяться форматирование, обозначаются в XSL дескриптором ;. Для указания элемента с конкретным названием (название элемента определяется тэгами, его обозначающими), т.е. определения класса элемента, можно использовать атрибут type=» «

Вот пример простейшего XSL-документа, определяющего форматирование для фрагмента rose :

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

Инструкция указывает на то, что данное правило определяет элемент. Параметром type=»flower» задается название XML-элемента, для которого будет использоваться это правило. Программа-конвертор будет использовать HTML-тэги, помещенные внутри блока для форматирования XML-элемента, которому «предназначался» текущий блок. В том случае, если для какого-то элемента XML шаблон не определяется, в выходной документ будут добавлены тэги форматирования по умолчанию (например,

Процесс разбора XSL-правил является рекурсивным, т.е. если у элемента есть дочерние элементы, то программа будет искать определения этих элементов, расположенных «глубже» в дереве документа. Указанием на то, что необходимо повторить процесс разбора XML документа, теперь уже для дочерних элементов, является инструкция . Дойдя до нее, анализатор выберет из иерархического дерева XML-элементов нужную ветвь и найдет в XSL-шаблонах правила, определяющие форматирование этих нижележащих элементов. В том случае, если вместо мы укажем инструкцию ;, программа закончит движение по данной ветви и возвратится назад, в родительское правило. При этом текущее правило никакой информации в выходном HTML-документе изменять не будет, т.к. в данном случае означает, что содержимое элемента отсутствует.

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

Ниже приведен пример более сложного XSL-описания, некоторые фрагменты которого будут пояснены позже.

Корневое правило

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

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

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

Отношения между элементами

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

Как видно из примера, если в XML-документе будет найден элемент , являющийся дочерним по отношению к элементу (название статьи), то его форматирование будет несколько отличаться от элемента , расположенного внутри тэгов

Приоритеты правил

В том случае, если внутри XSL-документа встречается несколько правил для одного и того же элемента, то msxsl будет использовать то из них, которое более точно определяет позицию данного элемента. Т.е. если XSL-документ содержит следующие правила:

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


В общем случае приоритет правил определяется следующим образом (в порядке убывания приоритета):

* правила, помеченные специальным тэгом
* правила с наибольшим значением атрибута id, если он определен
* правила с наибольшим значением атрибута class, если он определен
* правила, имеющие наибольшую вложенность, определяемую тэгом
* правила, использующие атрибут type совместно с
* правила, в которых отсутствует атрибут type в или
* правила с более высоким приоритетом, задаваемым атрибутом priority тэга
* правила с наибольшим значением квалификаторов ,

Использование атрибутов элементов

Фильтрация элементов

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

Элемент сам по себе не определяет шаблон форматирования, он лишь управляет работой анализатора, обозначая, подобно , «нижележащие» элементы. В приведенном примере элемент должен быть расположен внутри элемента

Для того, чтобы в шаблоне выделить не только собственные дочерние элементы, но и дочерние элементы потомков, т.е. использовать несколько уровней вложенности, необходимо задать параметр from = «descendants». Если параметр имеет значение «children», что указывает на то, что выбор должен производится из списка собственных дочерних элементов, то атрибут from может опускаться, т.к. «children» является значением по умолчанию.
Правила стилей

В отличие от CSS, в XSL невозможно использование каскадных стилевых определений(т.е. нельзя использовать несколько правил для определения стиля одного того же элемента), т.к. такие ограничения вводит рекурсивный алгоритм работы программы — анализатора. Однако использование правил определения стиля(Style Rules) элемента позволяет каким-то образом скомпенсировать этот недостаток.

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

Если бы мы не определили правила , то в выходной документ не было бы помещено никакой информации, т.к. элемент только определяет параметры стилевого оформления, не предпринимая никаких других действий.

Также надо учитывать, что XSL-анализатор использует CSS для определения задаваемого правилами стиля в выходном HTML-документе, тем самым предоставляя нам возможность использования этого мощного средства при оформлении HTML-страниц После обработки приведенного в примере фрагмента в выходной документ будут помещены следующие элементы:

Еще один пример:

Стили в формате CSS:

Фрагмент XSL-документа, позволяющего использовать подобные стилевые определения:

Сценарии

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

Для написания сценариев XSL использует специальный скриптовый язык — ECMAScript. Однако в msxsl для этих целей можно применять Microsoft JavaScript — язык, который объединил в себе некоторые элементы стандартного JavaScript и ECMAScript.
Вычисление выражений

Наиболее простым примером использования сценариев в XSL -документе является вычисление значений параметров описываемых элементов. Для этого надо просто поставить знак равенства в качестве первого символа параметра, что заставит XSL-процессор вычислить значение выражения(синтаксис этого выражения должен отвечать требованиям JavaScript). Например, после разбора этого правила:

в выходном документе окажутся следующие инструкции:

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

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

После обработки этого фрагмента в выходной документ будет помещен элемент:

Другим способом помещения в выходной HTML-документ информации, являющейся результатом выполнения каких-либо операций JavaScript – сценариев является использовнаие инструкции ;:

Метод childNumber в данном случае возвращает текущий номер дочернего элемента.
Определение функций и глобальных переменных

Если использовать эти правила для следующего XML-документа:

то в результате мы получим такой HTML-файл:

Применение языка преобразований XSLT

Язык преобразований XSLT

Во второй лекции мы уже рассматривали пример с использованием XSLT . В этой лекции мы рассмотрим эту технологию более подробно. XSL (eXtensible Stylesheet Language) переводится как Расширяемый Язык Стилей, и представляет собой язык для создания стилей XML документов. XSLT(XSL Transformations) — это язык преобразований XSL и является его частью. Стиль XSLT предназначен для преобразования иерархической структуры и формата документа XML . Результатами преобразования могут стать XML — файл , текстовый файл , программный код, HTML — файл , файл в формате PDF , и так далее. Этот язык предоставляет мощные возможности для манипуляции данными, информацией, текстом в иерархическом виде.

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

XSLT был разработан консорциумом W3C (World W >XSLT 1.0 стала рекомендацией 16 ноября 1999 года, а версия XSLT 2.0 стала рекомендацией 23 января 2007 года. Обе версии используются достаточно активно, и в этой лекции мы рассмотрим ту базовую функциональность, которая является для них общей. А это значит, что рассматривать будем в основном первую версию. Также упомянем некоторые команды из второй версии.

Как работает XSLT

Модель XSLT включает в себя такие части как:

  • документы XML,
  • стили XSLT ,
  • процессор XSLT ,
  • выходные документы.

Документы XML являются входными данными, которые нужно преобразовать в другие документы. Документ стиля XSLT является корректным (well formed) документом XML и содержит набор правил для выполнения преобразования. Иными словами, документ стиля является шаблоном.

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

Процессоры XSLT имеют множество реализаций и встроены во многие браузеры вроде Internet Explorer, Firefox, Mozilla, Opera и другие. В Internet Explorer используется инструмент MSXML, разработанный Microsoft. XSLT — процессор встроен в Internet Explorer, начиная с версии 4.5. Сгенерированный результат примеров данной лекции можно просматривать путем открытия XML -файлов в одном из браузеров. В конце лекции мы рассмотрим возможности запуска трансформации программным путем, используя соответствующие классы языка программирования.

XPath

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

Применение XSLT

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

Для преобразования документа XML необходимо добавить в начало документа инструкцию, подобную следующей:

XSL — файл стилей обычно содержит множество элементов, самым главным из которых является элемент xsl :stylesheet . Именно он указывает, что данный XML — файл является файлом стилей. Кроме него могут содержаться другие элементы, например xsl :template , xsl :value-of . Документ XML и файл стиля передается в XSLT — процессор , который обрабатывает данные файлы, выполняет преобразование и выводит результат трансформации.

Ниже представлен документ XML , содержащий список языков программирования.

Необходимо вывести этот список в формате HTML . Для этой цели используем инструкцию xsl :for-each , которая будет применять часть шаблона к секциям документа, наименование которых указано в атрибуте select . В нашем случае укажем select=»languages/language» .

Файл стилей будет применяться следующий:

Шаблон внутри xsl :for-each выводит содержимое каждого элемента language из languages . Для этой цели используется инструкция xsl :value-of и задаваемый атрибут select=».» . Это означает, что процессор должен выбирать текст содержимого текущего элемента в документе. Кроме отражения содержимого можно задавать имена конкретных тегов, а также атрибутов для выборки значений, хранящихся в них. Примеры будут рассмотрены далее.

Откроем XML файл через Internet Explorer или другой браузер . Будет выведен такой текст:

Мои любимые языки:

  • C#
  • Visual Basic
  • Delphi
  • Prolog

Одним из самых главных элементов в стиле является xsl :template . Служит для определения повторно используемого шаблона и содержит правила, по которым будет преобразован документ XML . В атрибуте match содержится выражение для отбора узлов, к которым будет применен шаблон . Также может присутствовать атрибут name . В этом случае есть возможность вызывать шаблон по имени инструкцией xsl :apply-templates .

Для повторения вывода шаблона для каждого элемента документа применяется инструкция xsl :for-each . Шаблон выполняется для каждого элемента, соответствующего условию, указанному в атрибуте select .

Инструкция xsl :value-of служит для вычисления выражения, записанного в атрибуте select с последующим выводом результата в том месте, где расположен сам элемент.

Фильтрация

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

Один из них — это применение атрибута select инструкции xsl :for-each , а второй — применение атрибута match элемента xsl :template . Применение match мы рассмотрим позже, а сейчас рассмотрим select .

Изменим немного файл с данными: добавим атрибут high , обозначающий, является ли язык из нашего списка языком высокого уровня. Также расширим сам список языков.

Заметим, что значение false для атрибута high стоит только для значения «Assembler» . Изменим немного файл таблицы стилей:

В секции [@ high =’true’] мы указываем, что выбирать следует только те узлы документа, у которых атрибут high имеет значение ‘true’ . Знак @ является символом, указывающим на то, что после него стоит имя атрибута.

Посмотрим на результат:

Языки высокого уровня:

  • C#
  • Visual Basic
  • Delphi
  • Prolog

  • Java
  • Perl

Как видим, значение «Assembler» не отображается в списке языков, то есть процессор XSLT отфильтровал данные согласно заданным условиям.

Сортировка

Кроме фильтрации другой часто применяемой операцией при генерации кода является сортировка . Атрибут order-by инструкции xsl :for-each служит для сортировки результата, для обозначения порядка прохода узлов документа при выполнении трансформации. Сортируемые поля перечисляются через точку с запятой, а также имеют перед своим названием знаки «+» или «-» , означающие сортировку по возрастанию или убыванию.

Рассмотрим немного измененный вариант документа — вместо атрибута high будем использовать элемент level , принимающий значения high или low . А имя языка запишем в элемент name .

В следующей таблице стилей для инструкции xsl :for-each применим атрибут order-by со значением +name , где знак плюса означает, что надо отсортировать по возрастанию.

В атрибуте select мы фильтруем по значению элемента level . Также в атрибуте select инструкции xsl :value-of указываем непосредственно имя элемента.

Получается такой результат.

Языки высокого уровня:

  • C#
  • Delphi
  • Java
  • Perl
  • Prolog
  • Visual Basic

Названия языков отсортированы в алфавитном порядке и значение «Assembler» не отображается в списке.

Другим способом сортировки является применение элемента xsl :sort путем вложения в xsl :for-each или в xsl :apply-templates . Элемент xsl :sort имеет атрибуты select и order , которые указывают на элементы, по которым должна осуществляться сортировка и на порядок сортировки соответственно.

Вложенные шаблоны

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

В данном примере у нас будут два шаблона. Один будет основной, для таблиц, а другой будет вызываемым из него, для полей таблиц. Для вызова шаблона используется инструкция xsl :apply-templates .

XSLT -процессором будет сформирован следующий HTML -код:

При открытии сгенерированного результата в браузере будет показано следующее:

Инструкция xsl :apply-templates позволяет вызывать определенный шаблон и выполнять его много раз. Кроме того она является более наглядной и удобной альтернативой xsl :for-each .

Создание отчетов на основе 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?

Элемент xsl:key

Похожие главы из других книг

Элемент

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

Элемент

Элемент Внутри элемента приводится текст из одной или нескольких строк, в котором можно описать примеры запуска сценария. Если сценарий был запущен с ключом /? в командной строке или в сценарии встретился вызов метода ShowUsage объекта WshArguments, то этот текст

Элемент

Элемент При помощи элемента осуществляются проверки условия и принимаются действия на основе результата проверки. Он во многом похож на оператор if в языках программирования. У элемента один атрибут:• test (обязательный). Устанавливается в

Элемент

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

Элемент

Элемент xsl:value-of

Элемент xsl:if

Элемент xsl:if Синтаксис элемента следующий: Элемент xsl:if является простейшим условным оператором в XSLT. Выражение, содержащееся в обязательном атрибуте test, вычисляется и приводится к булевому типу. В том и только том

Элемент xsl:for-each

Элемент xsl:key

Элемент Form

Элемент Form Элемент Form является контейнером для элементов управления и является рабочей площадкой для создания пользовательского интерфейса программы. Класс Form имеет несколько свойств, которые могут различаться в зависимости от выбранной целевой

Элемент Button

Элемент Button Для создания обычной кнопки используется класс System.Windows.Forms.Button. Эта кнопка обладает всеми основными функциями, которые есть у такого же класса в полной версии .NET Framework. Кнопка предназначена для обработки нажатия стилуса на соответствующую область экрана. В

Элемент TextBox

Элемент TextBox В предыдущем примере дата отображалась в текстовом поле. Это поле создается при помощи класса TextBox, который позволяет вводить текст. Данный элемент поддерживает такие стандартные свойства, как BackColor и ForeColor. Событие Click элементом TextBox не поддерживается, но

Элемент TrackBar

Элемент TrackBar Элемент управления TrackBar предназначен для установки числового значения при помощи перемещения ползунка по числовой шкале. Основную работу с элементом разработчик выполняет при помощи свойств Minimum, Maximum и Value. Ползунок может располагаться как вертикально, так

Элемент

Элемент Элементы – это любые единичные компоненты структуры, например, заголовок, абзац текста, фотография или

Точечный элемент

Точечный элемент Snap to Node – привязка к геометрическому объекту «точка» , сформированному командой POINT.Точки, входящие в определение блока, после его вставки могут служить узлами

Элемент

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

Общий код преобразования XSLT

У меня здесь довольно сложная задача.

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

Пример XML:

Желаемый результат:

Таким образом, логика заключается в том, что, если есть другие элементы (подавленные эл.) Под элементом (верхний эл.) — подавленный эл. get surround через
name of upper el.

    all suppressed el.

и т.д.

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

Fe, если ChildThree не имеет ChildFour под собой, это будет просто
ChildThree> вместо

Надеюсь, я объяснил себе это ясно. :)

PS Вот как это должно выглядеть в браузере, более или менее (просто для визуального представления, так как мы, люди, хотим видеть вещи.: P)

Язык трансформации XSL

Что такое XSL трансформация

Спецификация XSL (eXtensible Stylesheet Language) – еще один набор рекомендаций от W3C, который на этот раз представляет собой язык описания трансформации или набора преобразований данных XML документов в другие форматы. Трансформация осуществляется из одного XML формата в другой, например из документа XML, соответствующего вашей прикладной схеме в формат XML документа Microsoft Office или просто в XHTML. Возможно, также, преобразование не в расширение XML, а в любой другой структурированный формат, к примеру, в HTML (стандарты HTML и XHTML сильно похожи, но только внешне) или же просто в произвольное текстовое представление.

Слово stylesheet в названии стандарта заставляет многих проводить аналогию с другим инструментом форматирования языков разметки — CSS (Cascading Style Sheets) – каскадными таблицами стилей. Оба эти стандарты имеют из общего, скорее всего только это самое слово в названии. С использованием XSL можно добиться эффекта применения CSS, но CSS ни разу не аналог XSL. Вот их принципиальные отличия:

  • CSS оказывает влияние только на стиль представления данных HTML/XHTML, в то время, как XSL может легко изменить само их содержание.
  • CSS применяется на стороне клиента интернет браузером, а XSL может быть применен как на стороне клиента, так и на стороне сервера.
  • XSL является расширением XML, а CSS – отдельный формальный язык.

Стандарт XSL, в контексте преобразований XML в HTML, ближе по своему назначению к PHP (Hypertext Preprocessor) – скриптовому языку веб-программирования, применяемому на стороне сервера. И PHP и XSL могут существенно сократить объемы страниц интернет ресурсов, позволяя хранить только их содержимое (в базе данных или в XML файлах): без параметров стилей форматирования, самой HTML разметки, ссылок и метатегов. Более того, они могут использоваться совместно: на первом этапе средствами PHP формируется XML документ, соответствующий структуре запрашиваемой пользователем интернет страницы, а на втором этапе XSL преобразует этот XML в HTML. На завершающем этапе все это дело форматирует и “раскрашивает” браузер уже на стороне клиента по правилам, указанным в CSS. Таким образом, экономится не только место на сервере, но и объем трафика, поскольку передаются данные в оптимальном для каждого конкретного случая XML формате.

Применением XSL весьма широкое. К примеру, XSL трансформация используется для преобразования результатов запросов в контексте работы информационных систем в удобный для восприятия, печати и дальнейшей обработки вид. Далее вашему вниманию будет представлен обзор основных конструкций XSL, инструмент для отладки схем трансформации и пример преобразования XML отчета в HTML.

Основные элементы или синтаксис XSL

Для составления XSL преобразований необходимы знания следующих стандартов:

  1. Синтаксис или XML схема языка преобразований XSL.
  2. Язык запросов к элементам XML документа XPath.
  3. Формат целевого документа (чаще всего HTML).

С HTML многие знакомы, про XPath можно узнать, перейдя по соответствующей ссылке, а список основных элементов XSL будет представлен ниже.

Заголовок схемы XSL трансформации

Определение заголовка схемы трансформации XSL является корневым элементом соответствующего XML документа. Файлам со схемами трансформации чаще всего дают расширения .xsl. Помимо определения пространства имен xsl, заголовок схемы трансформации может содержать параметры выведения (output) результата трансформации: xml, html или text. Если элемент output не указан явно, то его параметры определяются интерпретатором по ходу разбора схемы трансформации. Параметры вывода – различные атрибуты элемента output могут влиять на форматирование конечного результата: появление дополнительных пробелом, символов перевода каретки и т.п. Я обычно не уделяю особого внимания этому элементу, поскольку в случае преобразования в XML дополнительное форматирование или его отсутствие мне не мешает, а в случае HTML его обработка — проблемы интернет браузера. С обычным текстовым форматом вывода я не сталкивался.

Шаблон XSL

Шаблон XSL используется для применения группы преобразований к определенному фрагменту XML документа. Группа преобразований помещается внутри определения шаблона, а целевой фрагмент документа отбирается посредством XPath запроса, указанного в атрибуте match. Самый распространенный вариант запроса – имя дочерних по отношению к контексту разбора элементов. Контекстом разбора до начала преобразований является сам документ и постепенно, по мере применения XSL шаблонов, контекст перемещается по структуре документа в соответствии с результатами XPath запросов. Пример шаблона ниже.

Как видно из примера, шаблон применяется к XML элементам DataSet. В результате преобразования формируется HTML заголовок с текстом, соответствующим атрибуту Caption трансформируемого элемента, создается HTML таблица и по очереди применяются к дочерним по отношению к DataSet элементам два шаблона: с запросами элементов Columns и Records. Шаблоны для обработки элементов Columns и Records должны быть определены в схеме трансформации отдельно.

Условные операторы XSL и вызов параметризованного шаблона

При должном владении XSL с его помощью можно даже писать небольшие программы. Я имею в виду не программное управление обработкой данных, а решение задач, которые вообще не связанны с их обработкой. Такие случаи, безусловно, экзотика, но в процессе обработки сложно структурированных данных без проверки условий и циклов иногда не обойтись. Спецификация XSL поддерживает условные операторы, вызовы шаблонов с передачей параметров, изменение значения параметров в соответствии с математическими выражениями и т.д. Пример шаблона с оператором выбора и условным оператором приведен ниже:

В процессе обработки элементов Column анализируется значение атрибута Name и в зависимости от его значения вызывается определенный шаблон. Шаблоны могут иметь имя, и для их вызова используется конструкция call-template. Сами шаблоны Name и AnyColumn определены в документе отдельно. Шаблон AnyColumn к тому же является параметризованным – принимает параметры выравнивания текста в ячейке таблицы. Каждый элемент when соответствует варианту выбора, а элемент otherwise – всем остальным вариантам. Полное описание примера трансформации будет приведено в следующем разделе.

В конце тела шаблона присутствует условный оператор, с помощью которого определяется вид пустой ячейки: если значение атрибута Caption – пустая строка, то выводим символ “-”. Обратите внимание, что шаблон, помимо условия выбора элементов Column содержит атрибут mode со значением Row. Атрибут mode можно использовать для различных шаблонов с одинаковым значением атрибута match. В ходе трансформации именно значение атрибута mode в конструкциях применения шаблона apply-template будет определять выбор шаблона. Вот пример.

Таким образом, если у шаблона не указано имя, то возможность его применения обусловлена контекстом трансформации в соответствии со значениями атрибута match и, дополнительно, атрибута mode. Место применения шаблона по контексту определяется конструкцией apply-template. Если шаблон имеет имя, то его можно принудительно применить к текущему контексту с использованием конструкции call-template без изменения самого контекста.

Цикл и сортировка в XSL

Язык XSL не только позволяет гибко настраивать трансформацию данных, но и проводить их предварительную сортировку. Сортировка доступна только в контексте перебора элементов, организованного циклом for-each. Какие элементы перебирать определяет атрибут select элемента for-each, а по каким данным их сортировать определяет уже атрибут select элемента sort. Значениями обоих этих атрибутов должно быть XPath выражение.

Определение параметризованного шаблона XSL и присвоение значений атрибутов

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

Обратите внимание, каким образом выходному элементу p присваивается значение атрибута align – c помощью отдельной конструкции attribute и конструкции value-of, которая обращается к значению входного параметра.

Отладчик XSL схем

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

Скачать демонстрационную программу.
Скачать пример XSL трансформации.
Скачать Microsoft .NET Framework 3.5 SP1.

Окно отладчика XSL разделено на 4 части: область редактирования XSL, область просмотра входного XML, область просмотра результата трансформации в текстовом виде HTML и область просмотра результата в интернет браузере. В качестве примера данных используется все тот же отчет, что рассматривался в ходе изучения XPath, а в качестве XSL схемы – преобразование отчета в таблицу HTML. Фрагменты этой схемы трансформации уже были представлены выше в разделе описания синтаксиса XSL. Теперь все это предстанет в виде единого документа. Вот перечень требований к результатам трансформации:

  • Список персонала должен быть отсортирован по значению Ф.И.О. в алфавитном порядке.
  • Выравнивание первой колонки по левому краю, выравнивание стажа по правому краю, выравнивание всех остальных колонок по центру.
  • Пустые значения обозначаются прочерком.

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

Пример XSL трансформации на C# можно посмотреть здесь.

Справочные материалы
Опубликовал +автор Март 07 2012 11:56:14 20043 Прочтений
Компьютерные курсы и курсы программирования

Курс для начинающих программистов на C# и VB.NET.

Построение SQL запросов и работа с базой данных.

Программирование на C#. Краткое руководство.

Применение регулярных выражений.

Примеры программной Plug-in архитектуры.

Язык разметки XML и его расширения с примерами.

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна: решения типовых задач верстки.

Руководство по программированию на PHP для начинающих.

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Илон Маск рекомендует:  Шаблон сайта магазина подарков HTML, CSS, JS
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Справочные материалы