
- •Оглавление
- •1. История появления xml и его особенности. Хорошо оформленный документ
- •2. Структура документа xml. Верный документ
- •3. Ссылки на сущности, секция cdata. Комментарии, атрибуты, имена
- •4. Пространства имён xml. Инструкции по обработке
- •5. Конструкции dtd: объявление типа элемента, объявление атрибутов
- •6. Конструкции dtd: объявление сущности, объявление обозначения
- •7. Размещение описания dtd. Программы-анализаторы xml
- •8. Описание схемы документа на языке xsd. Встроенные простые типы
- •9. Определение новых простых типов в xsd
- •10. Объявление элементов и их атрибутов в xsd
- •11. Определение сложных типов в xsd
- •12. Пространства имён языка xsd. Связь документа xml со своей схемой
- •13. Создание ссылок на языке xLink. Пространство имён языка xLink
- •14. Атрибуты, используемые при создании ссылок на языке xLink
- •15. Типы ссылок, создаваемых на языке xLink
- •16. Создание банка ссылок. Программы-обработчики атрибутов xLink
- •17. Таблицы стилей css в языке xml. Язык описания стилей xsl
- •18. Язык записи преобразований xslt бред, не стала разбираться, что из этого надо, а что нет
18. Язык записи преобразований xslt бред, не стала разбираться, что из этого надо, а что нет
Одна из реализаций XML. По традиции, документ, записанный на языке XSLT, называется таблицей стилей (stylesheet), хотя его правильнее назвать документом, содержащим правила преобразований.
Все элементы XML, объявленные в языке XSLT, относятся к пространству имен http://www.w3.org/1999/XSL/Transform. Обычно они записываются спрефиксом xsl. Если принят этот префикс, то корневой элемент документа XSLT— таблицы стилей— будет называться xsl:stylesheet. Как синоним этого имени можно записывать корневой элемент таблицы стилей с именем xsl:transform.
У корневого элемента xsl:stylesheet есть один обязательный атрибут version, указывающий версию языка. Во время написания книги его значением был номер "1.0". Для процессоров XSLT 2.0 значение атрибута version="i.O" будет означать, что надо обеспечить обратную совместимость с версией XSLT 1.0.
Простейшая таблица стилей XSLT выглядит так, как записано в листинге 8.6.
Листинг 8.6. Простейшая таблица стилей XSLT
<?xml version="1.0" encoding="windows-1251" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="CP866" />
</xsl:stylesheet>
Здесь только определяется префикс xsl пространства имен http:// www.w3.org/1999/XSL/Transformи задается один стиль — шаблон xsl:output для вывода на стандартное устройство.
Эту таблицу стилей записываем в файл, например, simple.xsl. Ссылку на таблицу стилей можно поместить в документ XML как одну из инструкций по обработке, а именно инструкцию xml-stylesheet. Пример такой ссылки приведен в листинге 8.7.
Листинг 8.7. Документ XML со ссылкой на таблицу стилей
<?xml version="1.0" encoding="windows-1251" ?>
<?xml-stylesheet type="text/xsl" href="srmple.xsl"?>
<notebook>
<person>
<name first="HBaH" second="neTpoBK4" surname="OmopoB" />
"Увидев" инструкцию по обработке xml-stylesheet, программа-обработчик XML, если она, кроме того, является процессором XSLT, выполнит преобразование, заданное в файле simple.xsl. Преобразование заключается в выводе содержимого элементов листинга 8.7 на стандартное устройство вывода, например, на консоль, без всякого форматирования.
Для того чтобы заставить процессоры делать отступы, нужно в элементе xsl: output записать атрибут indent:
<xsl:output method="text" encoding="CP866" indent="yes" />
Несложное форматирование вывода
Приведем пример чуть более развитой таблицы стилей. "Облагородим" вывод на консоль документа XML листинга 8.5, записав пробелы, перевод строки и поясняющие надписи. Все эти дополнительные символы, даже пробелы, записываются просто в содержимом элементов XSLT или в содержимом специального элемента xsl:text, причем символ перевода строки записывается в шестнадцатеричной форме строкой "&#хА" или просто "отбивается" клавишей <Enter>.
Кроме того, мы выведем не только содержимое элементов документа XML, но и значения их атрибутов. Таблица стилей XSLT для такого преобразования приведена в листинге 8.9.
Листинг 8.9. Таблица стилей XSLT для показа адресной книжки
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />
<xsl:template match="person">
<xsl:apply-templates />
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="name">
ФИО:
<xsl:value-of select="@first" /> <xsl:text> </xsl:text> <xsl:value-of select="@second" /> <xsl:text> </xsl:text> <xsl:value-of select="@surname" /> <xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="address">
<xs 1: text>Ajipec: < /xs 1: text>
<xsl:value-of select="street" /> <xsl:text>, </xsl:text> <xsl:value-of select="city" /> <xsl:text>, </xsl:text> <xsl:value-of select="zip" /> <xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="phone-list">
<xsl:text>CnMcoK телефонов: </xsl:text>
<xsl:text>Pa6o4Me: </xsl:text>
<xsl:value-of select="work-phone" /> <xsl:text>, </xsl:text>
<xsl:text> Домашние: </xsl:text>
<xsl:value-of select="home-phone" /> <xsl:text>, </xsl:text>
</xsl:template>
</xsl:stylesheet>
Как видите, основной элемент в таблице стилей — это элемент xsl: template, задающий шаблон отбора элементов для преобразования. В него вложены правила преобразования — элементы xsl:text, в которых записан выводимый поясняющий текст, и элементы xsl:vaiue-of, указьшающие, что надо преобразовать содержимое элемента или значение атрибута, имя которого записано в атрибуте select.
Обработка исходного дерева документа notebook начинается с выполнения правила:
<xsl:template match="person">
<xsl:apply-templates />
<xsl:text> </xsl:text>
</xsl:template>,
которое предписывает просмотреть все узлы-элементы person и применить к ним правила, записанные в его теле:
<xsl:apply-templates />
<xsl:text> &#хА;</xsl:text>
Правило <xsl: apply-templates /> заключается в рекурсивном просмотре всех узлов-потомков узла person и применении к ним всех подходящих правил, записанных в таблице стилей.
Правило <xsl:text> </xsl:text> заставляет вставить пустую строку после вывода преобразованного элемента person.
Для окончательного оформления понадобится проверка наличия или отсутствия тех или иных узлов.
Включение таблицы стилей в документ XML
Таблицу стилей можно записывать не в отдельный файл, а непосредственно в преобразуемый документ XML. Для этого в элементе xsl:stylesheet предусмотрен атрибут-идентификатор id, на который можно ссылаться обычным образом из инструкции по обработке xml-styiesheet.
Листинг 8.11. Таблица стилей внутри документа XML
<?xml version="1.0" encoding="windows-1251" ?>
<?xml-stylesheet type="text/xsl" href="#simple" ?>
<notebook>
<xsl:stylesheet version="1.0" id="simple"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="CP866" />
</xsl:stylesheet>
<person>
<name first="HBaH" зесопё="Петрович" surname="OmopoB" />
<address>
<street>CanoBaH, 12 — 34</street> <city>Hoвoкoзлoвcк</city> <zip>12332K/zip> </address>
<phone-list>
<work-phone>12 34 5 6</work-phone>
<home-phone>654321</home-phone> </phone-list>
</person>
<person>
<name first="MapMH" second="HBaHOBHa" зигname="Федорова" />
<address>
<street>IbcKHHH, 12</street> <city>3ape4eHCK</city> <zip>321123</zip> </address>
<phone-list>
<home-phone>2 2 4 32 К/home-phone> </phone-list>
</person>
</notebook>
Преобразование документа XML в документ HTML
Таблицы стилей, записанные в листингах 8.6 и 8.9, предназначены для преобразования документа XML в простой "плоский" текст для вывода на консоль или в текстовый файл. Приведем пример преобразования документа XML листинга 8.7 в документ HTML. Соответствующая таблица стилей записана в листинге 8.12. Обратите внимание на то, что в элементе xsl:outout указан метод вывода "html".
Листинг 8.12. Таблица стилей для преобразования XML в HTML
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="windows-1251"/>
<xsl:template match="/">
<htmlxheadxtitle>Aj]pecHaH KracKKa</title></head>
<body><h2>OaMnnjot, адреса и телефоны</п2> <xsl:apply-templates />
</body></html>
</xsl:template>
<xsl:template match="name">
<p />
<xsl:value-of select="@first" /> <xsl:text> </xsl:text> <xsl:value-of select="@second" /> <xsl:text> </xsl:text> <xsl:value-of select="@surname" /> <br />
</xsl:template>
<xsl:template match="address">
<br />
<xsl:value-of select="street" /> <xsl:text> </xsl:text> <xsl:value-of select="city" /> <xsl:text> </xsl:text> <xsl:value-of select="zip" /> <br />
</xsl:template>
<xsl:template match="phone-list">
Рабочий: <xsl:value-of select="work-phone" /> <br /> Домашний: <xsl:value-of select="home-phone" /> <br />
</xsl:template>
</xsl:stylesheet>
Из листинга 8.12 хорошо видно, что теги языка HTML записываются в таблице стилей XSL как простой текст. Процессор XSLT не обрабатьшает их, поскольку они объявлены в другом пространстве имен. Теги HTML перейдут в преобразованный документ без изменений, но будут записаны по правилам языка HTML, т. к. у элемента xsl:output указан атрибут method="htmi". Например, тег <br /> будет записан как <br>.
Эту таблицу стилей можно записать в файл, например ntb.xsl, и сослаться на него в листинге 8.7, описывающем адресную книжку, начав листинг следующими строками:
<?xml version="1.0" encoding="windows-1251"?> <?xml-stylesheet type="text/xsl" href="ntb.xsl"?> <notebook> <! Содержимое адресной книжки —> </notebook>
После этого любой браузер, "понимающий" XML и XSLT, например Mozilla или Internet Explorer 6.x, покажет файл notebooLxml, содержащий листинг 8.7, как предписано таблицей стилей листинга 8.12. На рис. 8.1 показано окно браузера с результатом преобразования.