- •Практическая работа №1: "Форматирование текста и списков".
- •1. Сформатируйте на html один из представленных ниже нумерованных списков:
- •1.2 Вариант 2.
- •1.3 Вариант 3.
- •2. Сформатируйте на html один из представленных ниже ненумерованных списков:
- •2.1 Вариант 1.
- •Практическая работа №2: "Форматирование таблиц".
- •1. Сформатируйте на html одну из представленных ниже таблиц:
- •1.1 Вариант 1.
- •1.2 Вариант 2.
- •1.3 Вариант 3.
- •2. Сформатируйте на html одну из представленных ниже таблиц:
- •2.1 Вариант 1.
- •2.2 Вариант 2.
- •2.3 Вариант 3.
- •3. Отчет должен содержать:
- •2.2 Вариант 2.
- •2.3 Вариант 3.
- •3. Отчет должен содержать:
- •Практическая работа №3: "Вставка изображений".
- •1. Сформатируйте на html один из представленных вариантов задания:
- •1.1 Вариант 1.
- •1.2 Вариант 2.
- •1.3 Вариант 3.
- •2. Отчет должен содержать:
- •Практическая работа №4: "Формирование форм".
- •1. Сформатируйте на html один из представленных вариантов задания:
- •1.1 Вариант 1.
- •1.2 Вариант 2.
- •1.3 Вариант 3.
- •2. Отчет должен содержать:
- •Практическая работа №5: "Каскадные таблицы стилей".
- •1. Сформатируйте на html один из представленных вариантов задания:
- •1.1 Вариант 1.
- •2. Требования к выполнению задания:
- •3. Отчет должен содержать:
- •Практическая работа №6: "Фильтры. Создание интерактивной страницы".
- •1. Теоретические сведения:
- •2. Задание для выполнения:
- •3. Отчет должен содержать:
- •Практическая работа №7: "Составление схем xml-документов".
- •1. Краткие теоретические сведения:
- •2. Выполнение работы:
- •2.1 Работа с xml-документом.
- •2.2 Работа с xsl.
- •3. Отчет должен содержать:
- •Лабораторная работа № 8 Связывание данных xml c html
- •1. Теоретические сведения:
- •2. Отчет должен содержать:
- •Практическая работа №9: "Обработка запросов с помощью рнр".
- •1. Теоретическая часть.
- •1.1 Использование html-форм для передачи данных на сервер.
- •1.2 Метод get
- •1.3 Метод post
- •1.4 Обработка запросов с помощью php
- •2. Отчет должен содержать:
- •Практическая работа №10: "Функции в рнр".
- •1. Теоретические сведения:
- •2. Задание:
- •3. Отчет должен содержать:
- •Практическая работа №11: "Работа с файловой системой".
- •1. Теоретические сведения:
- •2. Задание:
- •3. Отчет должен содержать:
- •Лабораторная работа № 12 Внедрение объектов JavaScript в html-документ
- •1. Теоретические сведения:
- •2. Задание:
- •3. Отчет должен содержать:
- •Лабораторная работа № 13 Внутренние объекты JavaScript
- •1. Теоретические сведения:
- •2. Задания:
- •3. Отчет должен содержать:
- •Лабораторная работа № 14 Базовые конструкции языка JavaScript
- •1. Теоретические сведения:
- •2. Задания:
- •3. Отчет должен содержать:
- •Лабораторная работа № 15 Работа с окнами в JavaScript
- •1. Теоретические сведения:
- •2. Задания:
- •3. Отчет должен содержать:
- •Лабораторная работа №16 Работа с формами в JavaScript
- •1. Теоретические сведения:
- •2. Задание:
- •3. Указания к заданиям:
- •4. Отчет должен содержать:
- •Лабораторная работа 17 Изображения на Web-странице.
- •1. Теоретические сведения:
- •2. Задания:
- •3. Отчет должен содержать:
2. Выполнение работы:
2.1 Работа с xml-документом.
Ниже приставлен листинг программы XML-документа.
<?xml version="1.0" encoding="windows-1251" ?>
<?xml:stylesheet type="text/css" href="1.css"?>
- <notepad>
- <note id="1" date="11/04/99" time="13:30">
<subject>Важная деловая встреча</subject>
<importance />
- <text>
Надо встретиться с
<person id="1625">Иваном Ивановичем</person>
, предварительно позвонив ему по телефону
<tel>123-12-12</tel>
</text>
</note>
- <note id="2" date="12/04/99" time="13:00">
<subject>Позвонить домой</subject>
- <text>
<tel>124-13-13</tel>
</text>
</note>
...
- <note id="3" date="13/04/99" time="5:00">
<subject>Поехать с Максом на рыбалку</subject>
- <text>
Напомнить Максу чтобы он сварил кашу и взял блёсна.
<tel>124-10-13</tel>
</text>
</note>
</notepad>
2.2 Работа с xsl.
Листинги программ:
Результат работы:
Список работников
Статус |
Имя |
Страна |
Организация |
Зарплата(грн./час) |
Работник спецслужб |
Kordun Maxim |
Ukraine |
Sokol |
10.45 |
Работник спецслужб |
Sokotsky Igor |
Ukraine |
Sokol |
10.45 |
Работник спецслужб |
Deyneko Alexey |
Ukraine |
Sokol |
10.45 |
3. Отчет должен содержать:
3.1 Листинг программы (п.2.1).
3.2 Ответы на вопросы:
3.2.1 Каким образом осуществляется связь с каскадными таблицами стилей;
3.2.2 Как будет выглядеть результат работы.
3.3 Листинги программ и результат работы (п.2.2).
3.4 Ответы на вопросы:
3.4.1 Назначение XML;
3.4.2 Назначение CSS;
3.4.3 Назначение XSL.
Лабораторная работа № 8 Связывание данных xml c html
Цель работы: связывание данных XML c HTML
1. Теоретические сведения:
Рассмотрим простой пример XML-файла (ex01.xml).
<?xml version="1.0" encoding="WINDOWS-1251"?> <tutorial> <title>"Заметки об XSL"</title> <author>Леонов Игорь Васильевич</author> </tutorial>
Если мы откроем этот файл в браузере Internet Explorer, то мы увидим тот же самый текст, который приведен выше, вместе со всеми тегами и служебной информацией. Но нам не нужны теги и служебная информация! Мы хотим видеть только ту информацию, которая относится к делу, а при помощи тегов - управлять внешним видом этой информации. Эта задача решается легко и просто: необходимо к XML-файлу добавить шаблон преобразования - XSL-файл.
Перепишем наш XML-файл в следующем виде (ex01-1.xml).
<?xml version="1.0" encoding="WINDOWS-1251"?> <?xml-stylesheet type='text/xsl' href='ex01-1.xsl'?> <tutorial> <title>"Заметки об XSL"</title> <author>Леонов Игорь Васильевич</author> </tutorial>
И создадим XSL-файл ex01-1.xsl. Текст файла приведен ниже.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <p><strong><xsl:value-of select="//title""/></strong></p> <p><xsl:value-of select="//author"/></p> </xsl:template> </xsl:stylesheet>
Если мы теперь откроем файл ex01-1.xsl в браузере Internet Explorer, то мы увидим, что наша задача решена, - на экране осталась только необходимая нам информация, все теги исчезли. Результат, который вы получите на экране браузера, приведен ниже.
Разберем теперь более подробно первый пример.
Первая строка информирует браузер о том, что файл имеет формат XML. Атрибут version является обязательным. Атрибут encoding не является обязательным, но если у вас в тексте есть русские буквы, то необходимо вставить этот атрибут, в противном случае XML-файл просто не будет обрабатываться, - вы получите сообщение об ошибке.
Следующие строки - это тело XML-файла. Оно состоит из элементов, которые в совокупности образуют древовидную структуру. Элементы идентифицируются тегами и могут быть вложены друг в друга.
Элементы могут иметь атрибуты, значения которых тоже могут обрабатываться в соответствии с шаблоном.
На верхнем уровне XML-файла всегда находится один элемент. То есть файл вида
<?xml version="1.0" encoding="WINDOWS-1251"?> <tutorial> <title>"Заметки об XSL"</title> <author>Леонов Игорь Васильевич</author> </tutorial> <tutorial> <title>"Введение в CSP"</title> <author>Леонов Игорь Васильевич</author> </tutorial>
не будет обрабатываться браузером. Для преобразования в корректный XML-файл нужно добавить теги элемента верхнего уровня, например
<?xml version="1.0" encoding="WINDOWS-1251"?> <knowledgeDatabase> <tutorial> <title>"Заметки об XSL"</title> <author>Леонов Игорь Васильевич</author> </tutorial> <tutorial> <title>"Введение в CSP"</title> <author>Леонов Игорь Васильевич</author> </tutorial> </knowledgeDatabase>
Перейдем теперь к шаблону преобразования - к XSL-файлу. Задача XSL-файла - преобразовать дерево XML-файла в другое дерево, которое, например, будет соответствовать формату HTML и может быть изображено на экране браузера с учетом форматирования, выбора шрифтов и т.п.
Для того, чтобы браузер выполнил необходимое преобразование, нужно в XML-файле указать ссылку на XSL-файл
<?xml version="1.0" encoding="WINDOWS-1251"?> <?xml-stylesheet type='text/xsl' href='ex01-1.xsl'?>
Рассмотрим теперь текст XSL-файла
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <p><strong><xsl:value-of select="//title""/></strong></p> <p><xsl:value-of select="//author"/></p> </xsl:template> </xsl:stylesheet>
Первая строка файла содержит тег элемента xsl:stylesheet. Атрибуты элемента - номер версии и ссылка на пространство имен. Эти атрибуты элемента xsl:stylesheet являются обязательными. В нашем случае пространство имен - это все имена элементов и их атрибутов, которые могут использоваться в XSL-файле. Для XSL-файлов ссылка на пространство имен является стандартной.
Заметим, что XSL-файл является одной из разновидностей XML-файлов. Он не содержит пользовательских данных, но формат его тот же самый. Файл содержит элемент верхнего уровня xsl:stylesheet, а далее идет дерево правил преобразования.
В настоящем документе мы не будем подробно пояснять, что означает каждый элемент XSL-файла. Мы будем приводить различные примеры и показывать результат в каждом примере. Читатель сможет самостоятельно сопоставить различные элементы XSL-файла и инициируемые этими элементами преобразования исходного XML-файла с пользовательской информацией.
В дальнейшем тексты XML- и XSL-файлов мы будем приводить в черно-белом варианте. Вы всегда сможете открыть реальный файл и посмотреть все в цвете. При необходимости закомментируйте ссылку на XSL-файл. Синтаксис комментария следующий - <!-- Текст комментария -->.
В первом примере мы посмотрели, как с помощью элемента xsl:value-of можно вывести в HTML-формате содержание элемента (текст, заключенный между тегами). Теперь мы посмотрим, как при помощи того же самого элемента можно вывести значение атрибута элемента.
Рассмотрим следующий XML-файл ex02-1.xml
<?xml version="1.0" encoding="WINDOWS-1251"?> <?xml-stylesheet type='text/xsl' href='ex02-1.xsl'?> <tutorial> <dog caption="Собака: " name="Шарик"> <dogInfo weight="18 кг" color="рыжий с черными подпалинами"/> </dog> </tutorial>
В этом файле информация хранится не в содержании элементов, а в виде значений атрибутов.
Файл ex02-1.xsl имеет вид
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <P><B><xsl:value-of select="//dog/@caption"/></B> <xsl:value-of select="//dog/@name"/>. <xsl:value-of select="//dogInfo/@weight"/>, <xsl:value-of select="//dogInfo/@color"/>.</P> </xsl:template> </xsl:stylesheet>
Обратите внимание на синтаксис ссылки на атрибут элемента - //dog/@name. Имя элемента и имя атрибута разделены парой символов "/@". В остальном синтаксис тот же самый, что и для ссылки на содержание элемента.
Результат имеет следующий вид:
Собака: Шарик. 18 кг, рыжий с черными подпалинами.
Обратим теперь внимание на следующий момент. В XSL-файле мы никак не использовали элемент tutorial. На самом деле можно было использовать полный путь. Перепишем наш XML-файл, увеличив глубину дерева (ex02-2.xml)
<?xml version="1.0" encoding="WINDOWS-1251"?> <?xml-stylesheet type='text/xsl' href='ex02-2.xsl'?> <tutorial> <enimals> <dog caption="Собака: " name="Шарик"> <dogInfo weight="18 кг" color="рыжий с черными подпалинами"/> </dog> </enimals> </tutorial>
Файл ex02-2.xsl имеет вид
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <P><B><xsl:value-of select="//enimals/dog/@caption"/></B> <xsl:value-of select="//enimals/dog/@name"/>. <xsl:value-of select="//enimals/dog/dogInfo/@weight"/>, <xsl:value-of select="//dogInfo/@color"/>.</P> </xsl:template> </xsl:stylesheet>
Результат будет тем же самым.
В этом примере мы использовали полную ссылку для значений атрибутов. При выводе одиночных значений оба варианта - полная и сокращенная ссылка - работают одинаково.
На этом мы закончим разбор примеров с выводом одиночных значений и перейдем к выводу табличной информации - к выводу результатов запроса.
Вывод результатов запроса
До тех пор, пока мы работаем с несколькими реквизитами одного и того же объекта, разницы между XML и HTML практически нет. Однако стоит нам перейти к информации, содержащей несколько строк, как выгоды XML становятся очевидны. Но прежде чем перейти к выгодам, научимся выводить на экран простую таблицу.
Рассмотрим следующий XML-файл - ex03.xml. Текст его приведен ниже.
<?xml version="1.0" encoding="WINDOWS-1251"?> <tutorial> <enimals> <dogs> <dogsCaption>Собаки</dogsCaption> <dogsCaptionName>Кличка</dogsCaptionName> <dogsCaptionWeight caption="кг">Вес</dogsCaptionWeight> <dogsCaptionColor>Цвет</dogsCaptionColor> <dog> <dogName>Шарик</dogName> <dogWeight caption="кг">18</dogWeight> <dogColor>рыжий с черными подпалинами</dogColor> </dog> <dog> <dogName>Тузик</dogName> <dogWeight caption="кг">10</dogWeight> <dogColor>белый с черными пятнами</dogColor> </dog> <dog> <dogName>Бобик</dogName> <dogWeight caption="кг">2</dogWeight> <dogColor>бело-серый</dogColor> </dog> <dog> <dogName>Трезор</dogName> <dogWeight caption="кг">25</dogWeight> <dogColor>черный</dogColor> </dog> </dogs> </enimals> </tutorial>
Предположим, что это результат запроса к базе данных и выведем на экран соответствующую таблицу.
Простая таблица
Первый шаг - это, как всегда, добавление шаблона преобразования. Модифицируем наш файл, добавив в него ссылку на шаблон. В результате получим файл ex03-1.xml.
В этот файл добавлен шаблон преобразования ex03-1.xsl.
Рассмотрим этот шаблон подробнее. Вот его текст.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <table border="1"> <tr bgcolor="#CCCCCC"> <td align="center"><strong><xsl:value-of select="//dogsCaptionName"/></strong></td> <td align="center"><strong><xsl:value-of select="//dogsCaptionWeight"/></strong></td> <td align="center"><strong><xsl:value-of select="//dogsCaptionColor"/></strong></td> </tr> <xsl:for-each select="tutorial/enimals/dogs/dog"> <tr bgcolor="#F5F5F5"> <td><xsl:value-of select="dogName"/></td> <td align="right"><xsl:value-of select="dogWeight"/> <xsl:value-of select="dogWeight/@caption"/></td> <td><xsl:value-of select="dogColor"/></td> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet>
Первые две строки шаблона являются уже привычными. Следующие шесть строк - это строка, содержащая заголовки столбцов таблицы. Конструкция для извлечения текста заголовков таблицы вам уже знакома. А вот девятая строка является новой:
<xsl:for-each select="tutorial/enimals/dogs/dog">
Этот элемент шаблона позволяет выбрать и просмотреть все группы информации, полный путь к которым задается списком тегов "tutorial/enimals/dogs/dog". Обратите внимание - путь задается полностью, ни один из тегов опустить нельзя. Далее в ячейки таблицы помещается информация о наших собаках. В отличие от первых примеров путь к соответствующей информации тоже задается полностью. Попробуем, например, разместить информацию о кличке чуть-чуть иначе ex03-2.xml:
<dogName> <dogNick>Шарик</dogNick> </dogName>
Если мы в соответствующем XSL-файле поставим ссылку <xsl:value-of select="dogNick"/>, то в соответствующем столбце никакой клички мы не увидим. Ссылка должна быть полной - <xsl:value-of select="dogName/dogNick"/>. Вы можете самостоятельно поэкспериментировать с файлом ex03-2.xsl. Правильный результат приведен ниже.
Кличка |
Вес |
Цвет |
Шарик |
18 кг |
рыжий с черными подпалинами |
Тузик |
10 кг |
белый с черными пятнами |
Бобик |
2 кг |
бело-серый |
Трезор |
25 кг |
черный |
Сортировка
В предыдущих примерах порядок строк в таблице полностью соответствовал группам тегов в XML-файле. Этот порядок можно изменять. Добавим в тег
<xsl:for-each select="tutorial/enimals/dogs/dog">
атрибут order-by
<xsl:for-each select="tutorial/enimals/dogs/dog" order-by="dogName">
Наша таблица примет вид (ex03-3.xml, ex03-3.xsl).
Кличка |
Вес |
Цвет |
Бобик |
2 кг |
бело-серый |
Трезор |
25 кг |
черный |
Тузик |
10 кг |
белый с черными пятнами |
Шарик |
18 кг |
рыжий с черными подпалинами |
Более интересные результаты мы получим, если попытаемся отсортировать таблицу по столбцу "Вес". Вначале попробуем сделать по аналогии с предыдущим примером - атрибут order-by="dogName" заменим на order-by="dogWeight". Результат приведен ниже (ex03-4.xml, ex03-4.xsl).
Кличка |
Вес |
Цвет |
Тузик |
10 кг |
белый с черными пятнами |
Шарик |
18 кг |
рыжий с черными подпалинами |
Бобик |
2 кг |
бело-серый |
Трезор |
25 кг |
черный |
Таблица действительно отсортирована по столбцу "вес", но это не числовая, а строковая сортировка! Для того, чтобы браузер воспринял значения как числа, ему необходимо об этом сказать, - вместо order-by="dogWeight" необходимо написать order-by="number(dogWeight)". Теперь мы получили правильный результат (ex03-5.xml, ex03-5.xsl).
Кличка |
Вес |
Цвет |
Бобик |
2 кг |
бело-серый |
Тузик |
10 кг |
белый с черными пятнами |
Шарик |
18 кг |
рыжий с черными подпалинами |
Трезор |
25 кг |
черный |
Приведем теперь пример сортировки по нескольким столбцам. Различные элементы в атрибуте order-by должны разделяться символом ";" - order-by="number(dogWeight); dogName" (ex03-6.xml, ex03-6.xsl). Таблица приведена ниже.
Кличка |
Вес |
Цвет |
Трезор |
10 кг |
черный |
Тузик |
10 кг |
белый с черными пятнами |
Бобик |
18 кг |
бело-серый |
Шарик |
18 кг |
рыжий с черными подпалинами |
Следующий пример работает только под управлением XML-парсера версии 3. В нем строки сортируются по одному столбцу - по кличке собаки. Этот пример уже приводился выше, однако теперь мы используем новый синтаксис (ex03-7.xml, ex03-7.xsl).
Отметим разницу.
При использовании нового синтаксиса используется ссылка на другое пространство имен
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Это очень важный момент, и его никогда нельзя упускать из виду.
Кроме того, мы убрали атрибут order-by в элементе xsl:for-each и добавили другой элемент
<xsl:sort order="ascending" select="dogName"/>
Если элемент xsl:sort присутствует в элементе xsl:for-each, то он всегда должен стоять сразу после элемента xsl:for-each. Синтаксис элемента xsl:sort достаточно очевиден. В нем используются два атрибута: атрибут order - способ сортировки (по возрастанию или по убыванию) и атрибут select - имя поля, по которому производится сортировка. Если нам нужно отсортировать по первому элементу, как в данном примере, то вместо "dogName" можно было поставить точку - ".", для других элементов нужно указывать его имя, например "dogColor", если нам нужно отсортировать записи по цвету собаки. На самом деле атрибутов может быть пять - select, lang, data-type, order и case-order, но мы не будем здесь рассматривать все эти атрибуты, поскольку здесь мы не преследуем цель дать полное описание всех элементов, используемых в XSL, и их атрибутов.
Таблица результатов приведена ниже.
Кличка |
Вес |
Цвет |
Бобик |
2 кг |
бело-серый |
Трезор |
25 кг |
черный |
Тузик |
10 кг |
белый с черными пятнами |
Шарик |
18 кг |
рыжий с черными подпалинами |
С использованием нового синтаксиса легко сменить сортировку по возрастанию на сортировку по убыванию (ex03-8.xml, ex03-8.xsl). Этот пример работает только под управлением XML-парсера версии 3.
Разница заключается в одной строке
<xsl:sort order="descending" select="dogName"/>
Мы изменили значение атрибут order - значение ascending заменено на descending.
Таблица результатов приведена ниже.
Кличка |
Вес |
Цвет |
Шарик |
18 кг |
рыжий с черными подпалинами |
Тузик |
10 кг |
белый с черными пятнами |
Трезор |
25 кг |
черный |
Бобик |
2 кг |
бело-серый |
Покажем теперь сортировку по нескольким полям (ex03-9.xml, ex03-9.xsl). Этот пример работает только под управлением XML-парсера версии 3.
В этом примере у нас фигурируют две строки с элементом xsl:sort.
<xsl:sort order="ascending" select="number(dogWeight)" data-type="number"/> <xsl:sort order="ascending" select="dogName"/>
Строки вначале сортируются по весу собаки, а затем по их кличкам в алфавитном порядке. Обратите внимание - для того, чтобы сортировка выполнялась в числовой последовательности, в элемент xsl:sort мы добавили атрибут data-type. Таблица результатов приведена ниже.
Кличка |
Вес |
Цвет |
Волчонок |
3 кг |
темно-серый |
Трезор |
10 кг |
черный |
Тузик |
10 кг |
белый с черными пятнами |
Бобик |
18 кг |
бело-серый |
Шарик |
18 кг |
рыжий с черными подпалинами |
Заменив значение атрибута order by на descending, мы легко сгруппируем записи о собаках с одинаковым весом так, что клички будут идти в обратном алфавитном порядке. Соответствующий пример вы легко построите сами.
Кличка |
Вес |
Цвет |
Волчонок |
3 кг |
темно-серый |
Тузик |
10 кг |
белый с черными пятнами |
Трезор |
10 кг |
черный |
Шарик |
18 кг |
рыжий с черными подпалинами |
Бобик |
18 кг |
бело-серый |
Элемент XSL:IF - фильтр
Рассмотрим теперь способы фильтрации строк таблицы. Первый пример использует старый синтаксис. В нем условие фильтрации указывается непосредственно в атрибуте select (ex04-1.xml, ex04-1.xsl).
Ниже приведена строка, в которую мы внесли необходимые изменения.
xsl:for-each select="tutorial/enimals/dogs/dog[dogWeight$gt$10] " order-by="number(dogWeight); dogName;">
И таблица результатов.
Кличка |
Вес |
Цвет |
Шарик |
18 кг |
рыжий с черными подпалинами |
Трезор |
25 кг |
черный |
Вы видите, что в таблице остались только те собаки, чей вес превышает 10 кг, причем первым стоит Шарик, чей вес меньше.
Все дальнейшие примеры в этом параграфе работают только под управлением XML-парсера версии 3.
Более гибкие возможности нам предоставляет новый синтаксис (ex04-2.xml, ex04-2.xsl). Обратите внимание - в новом синтаксисе атрибут order-by в элементе xsl:for-each не поддерживается, вместо него мы вставили два элемента xsl:sort.
<xsl:sort order="ascending" select="number(dogWeight)"/> <xsl:sort order="ascending" select="dogName"/>
Кроме того, условие фильтра у нас вынесено в отдельный элемент xsl:if.
<xsl:if test="dogWeight>10">
Не забывайте указывать конечный тег элемента xsl:if.
<xsl:if test="dogWeight>10"> <tr bgcolor="#F5F5F5"> <td><xsl:value-of select="dogName"/></td> <td align="right"><xsl:value-of select="dogWeight"/> <xsl:value-of select="dogWeight/@caption"/></td> <td><xsl:value-of select="dogColor"/></td> </tr> </xsl:if>
В этом примере таблица результатов полностью аналогична предыдущей.
Кличка |
Вес |
Цвет |
Шарик |
18 кг |
рыжий с черными подпалинами |
Трезор |
25 кг |
черный |
Полностью преимущества нового синтаксиса проявляются при использовании функций.
Рассмотрим следующий пример (ex04-3.xml, ex04-3.xsl). В этом примере используется функция position(), определяющая порядковый номер фрагмента в исходном XML-файле.
Соответствующий элемент xsl:if.
<xsl:if test="position()<3">
Результат.
Кличка |
Вес |
Цвет |
Шарик |
18 кг |
рыжий с черными подпалинами |
Тузик |
10 кг |
белый с черными пятнами |
Продемонстрируем теперь использование более интересных функций - start-with(string,startSubstring) и contains(string,anySubstring). Функция start-with(string,startSubstring) проверяет, начинается ли строка string с подстроки startSubstring. Пример - ex04-4.xml, ex04-4.xsl).
Синтаксис элемента xsl:if.
<xsl:if test="starts-with($varDogName,$varStartWith)">
В этом элементе мы использовали переменные. Значения переменных были инициализированы ранее
<xsl:variable name="varStartWith"><xsl:value-of select="//letter"/></xsl:variable> <xsl:for-each select="tutorial/enimals/dogs/dog"> <xsl:variable name="varDogName"><xsl:value-of select="dogName"/></xsl:variable>
Переменная varStartWith представляет собой подстроку, с которой должны начинаться требуемые нам клички. Она не меняется, поэтому инициализируется перед циклом. Переменная varDogName содержит кличку собаки, она меняется на каждом шаге цикла и, соответственно, инициализируется в теле цикла.
Элемент letter XML-файла содержит букву "Т".
Результат.
Кличка |
Вес |
Цвет |
Тузик |
10 кг |
белый с черными пятнами |
Трезор |
25 кг |
черный |
Функция contains(string,anySubstring) проверяет, содержит ли строка string подстроку anySubstring. Пример - ex04-5.xml, ex04-5.xsl.
Синтаксис элемента xsl:if.
<xsl:if test="contains($varDogName,$varStartWith)">
Этот пример полностью аналогичен предыдущему. Элемент letter XML-файла содержит букву "о".
Результат.
Кличка |
Вес |
Цвет |
Бобик |
2 кг |
бело-серый |
Трезор |
25 кг |
черный |
Два элемента xsl:if, вложенные друг в друга, дают нам эффект оператора AND (ex04-6.xml, ex04-6.xsl).
Соответствующий фрагмент XSL-файла.
<xsl:if test="dogWeight>10"> <xsl:if test="dogWeight<20"> ... </xsl:if> </xsl:if>
Результат.
Кличка |
Вес |
Цвет |
Шарик |
18 кг |
рыжий с черными подпалинами |
Можно добиться и эффекта оператора OR. Для этого нам нужно включить два цикла, в каждом из которых формируется своя выборка (ex04-7.xml, ex04-7.xsl).
Соответствующий фрагмент XSL-файла.
<xsl:for-each select="tutorial/enimals/dogs/dog"> <xsl:sort order="ascending" select="number(dogWeight)"/> <xsl:if test="dogWeight<10"> <tr bgcolor="#F5F5F5"> <td><xsl:value-of select="dogName"/></td> <td align="right"><xsl:value-of select="dogWeight"/> <xsl:value-of select="dogWeight/@caption"/></td> <td><xsl:value-of select="dogColor"/></td> </tr> </xsl:if> </xsl:for-each> <xsl:for-each select="tutorial/enimals/dogs/dog"> <xsl:sort order="ascending" select="number(dogWeight)"/> <xsl:if test="dogWeight>15"> <tr bgcolor="#F5F5F5"> <td><xsl:value-of select="dogName"/></td> <td align="right"><xsl:value-of select="dogWeight"/> <xsl:value-of select="dogWeight/@caption"/></td> <td><xsl:value-of select="dogColor"/></td> </tr> </xsl:if> </xsl:for-each>
Результат.
Кличка |
Вес |
Цвет |
Бобик |
2 кг |
бело-серый |
Шарик |
18 кг |
рыжий с черными подпалинами |
Трезор |
25 кг |
черный |
Если сортировка не требуется, то можно вставить два элемента xsl:if в один элемент xsl:for-each.
Элемент XSL:IF - улучшение внешнего вида таблиц
Элемент xsl:if можно применять не только для фильтрации строк выборки. Очевидно, что он может быть полезен и во многих других областях. В этом параграфе мы разберем пример использования элемента xsl:if для улучшения внешнего вида таблицы. Заодно мы продемонстрируем реальное использование функции position(). Мы будем использовать эту функцию для того, чтобы чередовать цвет четных и нечетных строк таблицы (ex04-8.xml, ex04-8.xsl).
Фрагмент XSL-файла, который отвечает за требуемое чередование.
<tr> <xsl:if test="position() mod 2 = 0"> <xsl:attribute name="bgcolor">#CCCCCC</xsl:attribute> </xsl:if>
С элементом xsl:if и с функцией position() мы уже знакомы. Оператор mod дает нам остаток от деления на 2. А элемент xsl:attribute позволяет нам динамически подставлять в файл результатов различные атрибуты. Это очень мощный элемент, мы разберем еще одно применение этого элемента в следующем параграфе. А сейчас приведем для полноты картины таблицу результатов.
Кличка |
Вес |
Цвет |
Шарик |
18 кг |
рыжий с черными подпалинами |
Тузик |
10 кг |
белый с черными пятнами |
Бобик |
2 кг |
бело-серый |
Трезор |
25 кг |
черный |
