(Продолжение, начало см. в МК № 48, 5152, 3 (167, 170171, 174))
Циклы и таблицы
В прошлых статьях мы говорили о том, что возможности XSL выходят далеко за границы простого форматирования текста, хотя, как вы уже смогли убедиться, форматировать документы XML с помощью XSL легко и удобно. Пришло время продемонстрировать мощные средства XSL, предназначенные для трансформации исходного текста. Общая схема преобразования документа XML достаточно проста. Доступ к тем узлам, которые необходимо трансформировать, обеспечивается с помощью выражений XPath, после чего к содержимому этих узлов применяются шаблоны XSLT. В предыдущих статьях мы уже использовали некоторые из этих конструкций (xsl:template и xsl:apply-templates) для визуализации документов XML. Сейчас мы познакомимся с новым шаблоном xsl:for-each, который служит для организации циклов в стилевой таблице. Этот элемент языка XSLT рекомендуется использовать в тех случаях, когда результирующий документ должен иметь регулярную структуру, например, если документ следует представить в виде таблицы. Предположим, исходный документ XML имеет такой вид:
Рассмотрим следующую стилевую таблицу:
Если данное форматирование применить к исходному документу, то будет создан HTML-документ, содержащий таблицу, в которой каждая строка представляет собой данные об имени и заказах клиента. Инструкция xsl:for-eachобычно содержит шаблон, который последовательно применяется к узлам, описанным с помощью атрибута select. В данном примере форматирование осуществляется с помощью двух вложенных конструкций xsl:for-each. Первый шаблон xsl:for-each определяет прохождение в цикле всех элементов customer, а второй служит для того, чтобы для каждого элемента customer пройти все элементы order и оформить их в виде ячеек таблицы. Заметим, что выражение <xsl:for-each select=»customers/customer»> использует синтаксис XPath.
Рассмотрим еще один пример более подробно. Предположим, что нам требуется показать в виде таблицы следующий документ XML:
Допустим, нам понадобится вывести только название альбома и год записи песен. В этом случае следующий документ XSL можно использовать для визуализации оглавления CD-каталога:
Рассмотрим данную стилевую таблицу подробнее. Вы, наверное, заметили, что пространство имен
указанное во второй строке, отличается от пространства
которое мы использовали в предыдущих статьях. Хотя пространство имен, использованное в этой статье, не полностью соответствует последним стандартам консорциума W3C, тем не менее пользователи, у которых не установлена третья версия специальной программы-анализатора (MS parser 3.0), смогут увидеть результат преобразования XML-документа в окне Internet Explorer 5.0 (напомню, что процедура установки анализатора кратко описана в статье «XSL зеркало для XML», МК №5152 (170171)). Таким образом, указав «устаревшее» пространство имен, мы обеспечили возможность преобразования документа XML вне зависимости от того, имеется или нет parser 3.0 на компьютере пользователя.
Для того чтобы понять, как работает данная стилевая таблица, пройдем по ней сверху вниз. Тэг <xsl:template match=»/»> показывает, что поиск элементов, подлежащих трансформации, нужно начинать с корневого узла. Фрагмент
определяет таблицу с двумя колонками, заглавия которых Title и Year. Тэг
задает цикл, при прохождении которого специальное форматирование будет применяться к узлам CD, являющимся дочерними для элемента CATALOG. Атрибут order-by определяет порядок сортировки строк таблицы и не является обязательным. В данном случае таблица будет отсортирована по годам в убывающем порядке. Фрагмент
указывает на то, что в результате каждой итерации цикла формируется строка таблицы HTML, в ячейки которой заносятся значения элементов TITLE и YEAR. Обратите внимание на то, что для записи этих данных используется специальный тэг XSL xsl:value-of с атрибутом select, значением которого является имя элемента XML. В этом примере мы снова видим, как тэги XSL и HTML «сотрудничают» в стилевой таблице. Пора посмотреть, что же у нас в конце концов получилось. Создайте файл table_with_xml.xml и занесите в него документ XML. После тэга <?xml version=»1.0» ?> нужно вставить строку
декларирующую связь исходного документа со стилевой таблицей, которую в данном случае необходимо поместить в файл table_with_xml.xsl. Откройте этот файл в окне Internet Explorer, и вы увидите приблизительно такую же картинку, как на рисунке.