Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
xml.docx
Скачиваний:
49
Добавлен:
16.04.2015
Размер:
115.97 Кб
Скачать

18. Язык записи преобразований xslt бред, не стала разбираться, что из этого надо, а что нет

Одна из реализаций XML. По традиции, документ, записанный на языке XSLT, называется таблицей стилей (style­sheet), хотя его правильнее назвать документом, содержащим правила пре­образований.

Все элементы 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 пока­зано окно браузера с результатом преобразования.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]