Кроме того, условие фильтра у нас вынесено в отдельный элемент xsl:if.



Не забывайте указывать конечный тег элемента xsl:if.

В этом примере таблица результатов полностью аналогична предыдущей.

Полностью преимущества нового синтаксиса проявляются при использовании функций.

Рассмотрим следующий пример (ex04-3.xml, ex04-3.xsl). В этом примере используется функция position(), определяющая порядковый номер фрагмента в исходном XML-файле.

Соответствующий элемент xsl:if.



и

Результат.





<< предыдущая страница   следующая страница >>
Смотрите также:
Методическое пособие по курсу «Язык разметки xml. Часть 1» Методическое пособие для студентов специальности «Компьютерные системы и сети»
682.79kb.
3 стр.
Методическое пособие по курсу «Язык разметки xml. Часть 1» Методическое пособие для студентов специальности «Компьютерные системы и сети»
685.63kb.
3 стр.
Методическое пособие по дисциплине «Статистика» для специальности «Экономика и бухгалтерский учет (по отраслям): Методическое пособие /Под редакцией В. Ю. Ершовой
1269.9kb.
12 стр.
Методическое пособие по курсу персональная электроника жидкокристаллические мониторы Для студентов специальности 200800
254.83kb.
1 стр.
Учебно-методическое пособие по педагогической (методической) практике для студентов IV и V курсов, обучающихся по направлению 050100. 62 «Педагогическое образование»
701.15kb.
4 стр.
Методическое пособие по практике устной и письменной речи английского языка для студентов III-IV курсов
308.25kb.
3 стр.
Методическое пособие по практике устной и письменной речи английского языка для студентов III-IV курсов
271.89kb.
2 стр.
Информационно-методическая часть
28.96kb.
1 стр.
Учебно-методическое пособие для слушателей заочной формы обучения по специальности 210406. 65 «Сети связи и системы коммутации»
829.31kb.
10 стр.
Методическое пособие для студентов всех форм обучения специальности «Физическая культура для лиц с отклонениями в состоянии здоровья
482.09kb.
2 стр.
Учебно-методическое пособие для студентов, обучающихся по специальности 1-08 01 01 «Профессиональное обучение»
590.08kb.
4 стр.
Методическое пособие предназначено для студентов специальности "Психология"
1007.82kb.
6 стр.
Главная
страница 1страница 2страница 3

Лабораторная работа № 2 . Создание динамических web - страниц на основе языков xml, xsl

Цель работы:


Отображение XML-документа в виде HTML-страницы. Применение таблиц стилей. Вставка элементов HTML в XML-документы

Результат:


Динамическая страница на основе XML файла.

Этапы выполнения работы


Методы создания XSL приложений

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

Выполните отображение этого XML-документа с помощью простой и вложенной таблицы.

Добавьте постраничное отображение.

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

Прежде чем приступить к выполнению лабораторной работы, выполните следующие практические работы.


ПРАКТИЧЕСКАЯ РАБОТА № 1. Стилевые таблицы XSL, JavaScript и XML

РАБОТАЕМ ВМЕСТЕ:

Рассмотрим простой пример XML-файла (ex01.xml).






"Путешествие дилетантов"

Булат Окуджава

Если мы откроем этот файл в браузере Internet Explorer, то мы увидим тот же самый текст, который приведен выше, вместе со всеми тегами и служебной информацией.

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

Перепишем наш XML-файл в следующем виде (ex01-1.xml).









Путешествие дилетантов

Булат Окуджава



И создадим XSL-файл ex01-1.xsl. Текст файла приведен ниже.















Если мы теперь откроем файл ex01-1.xsl в браузере Internet Explorer, то мы увидим, что наша задача решена, - на экране осталась только необходимая нам информация, все теги исчезли. Результат, который вы получите на экране браузера, приведен ниже.





Рисунок 2

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

Перепишем XML-файл. Информационную часть изменять не будем, а шаблон укажем другой ex01-2.xml.





Путешествие дилетантов

Булат Окуджава

Создадим XSL-файл ex01-2.xsl. Текст файла приведен ниже.















Если мы теперь откроем файл ex01-2.xsl в браузере Internet Explorer, то результат будет другим.





Рисунок 3

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

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

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

Есть и еще одно соображение, которое может быть существенным для разработчиков баз данных. Большинство современных СУБД могут форматировать результаты запроса к базе данных в виде XML-файла. То есть при построении интерфейса пользователя в рамках технологии XML и XSL мы добиваемся определенной независимости от поставщика СУБД. В части организации вывода - практически полной независимости. А эта часть весьма велика в большинстве прикладных систем, ориентированных на работу с базами данных. Конечно, помимо вывода есть еще ввод и серверная обработка бизнес-логики, но здесь вам придется искать какие-то иные решения.

Разберем теперь более подробно первый пример. Напомним его текст.

Первая строка информирует браузер о том, что файл имеет формат XML. Атрибут version является обязательным. Атрибут encoding не является обязательным, но если у вас в тексте есть русские буквы, то необходимо вставить этот атрибут, в противном случае XML-файл просто не будет обрабатываться, - вы получите сообщение об ошибке.

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

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

На верхнем уровне XML-файла всегда находится один элемент. То есть файл вида







Путешествие дилетантов

Булат Окуджава



Привет школяр!

Булат Окуджава



Четки

Анна Ахматова



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





Путешествие дилетантов

Булат Окуджава



Привет школяр!

Булат Окуджава



Четки

Анна Ахматова



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

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


Рассмотрим теперь текст XSL-файла












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

Заметим, что XSL-файл является одной из разновидностей XML-файлов. Он не содержит пользовательских данных, но формат его тот же самый. Файл содержит элемент верхнего уровня xsl:stylesheet, а далее идет дерево правил преобразования.

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

В первом примере мы посмотрели, как с помощью элемента xsl:value-of можно вывести в HTML-формате содержание элемента (текст, заключенный между тегами). Теперь мы посмотрим, как при помощи того же самого элемента можно вывести значение атрибута элемента.

Рассмотрим следующий XML-файл ex02-1.xml









В этом файле информация хранится не в содержании элементов, а в виде значений атрибутов. Файл ex02-1.xsl имеет вид










.

,

.




Обратите внимание на синтаксис ссылки на атрибут элемента - //car/@Marka. Имя элемента и имя атрибута разделены парой символов "/@". В остальном синтаксис тот же самый, что и для ссылки на содержание элемента.

Результат имеет следующий вид:

Обратим теперь внимание на следующий момент. В XSL-файле мы никак не использовали элемент tutorial. На самом деле можно было использовать полный путь. Перепишем наш XML-файл, увеличив глубину дерева (ex02-2.xml)















Файл ex02-2.xsl имеет вид










.

, .




Результат будет тем же самым.

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

На этом мы закончим разбор примеров с выводом одиночных значений и перейдем к выводу табличной информации - к выводу результатов запроса.

Вывод результатов запроса

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

Рассмотрим следующий XML-файл - ex03.xml. Текст его приведен ниже.











Автомобили

Марка

Номер

Цвет



Opel

34с666

Белый





BMW

34rt66

Индиго





Mersedes

341111

черный





Mazda

456678

синий







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

Простая таблица

Первый шаг - это, как всегда, добавление шаблона преобразования. Модифицируем наш файл, добавив в него ссылку на шаблон. В результате получим файл ex03-1.xml.

В этот файл добавлен шаблон преобразования ex03-1.xsl.

Рассмотрим этот шаблон подробнее. Вот его текст.





































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




Этот элемент шаблона позволяет выбрать и просмотреть все группы информации, полный путь к которым задается списком тегов " tutorial/avto/cars/car ". Обратите внимание - путь задается полностью, ни один из тегов опустить нельзя. Далее в ячейки таблицы помещается информация о наших автомобилях. В отличие от первых примеров путь к соответствующей информации тоже задается полностью. Попробуем, например, разместить информацию о марке чуть-чуть иначе ex03-2.xml:


Opel

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



Марка

Номер

Цвет

Мерседес

341111

Черный

Шкода

456678

Красный

Опель

34с666

Белый

БМВ

342rt66

Индиго

Сортировка в XSLT применима к некоторому множеству узлов. Она изменяет типичную для XSLT последовательность вывода элементов (в порядке просмотра докумнента) и определяется наличием в элементе xsl:apply-templates одного или нескольких элементов xsl:sort. Синтаксис этого элемента прост:



<xsl:sort

select="выражение"

datatype="тип данных"

order={"ascending" | "descending"}

case-order={"upper-first" | "lower-first"} />

Атрибут select содержит выражение, оцениваемое для каждого узла множества и являющееся критерием сортировки. Атрибут order определяет порядок сортировки: значение "ascending" ("восходящий") означает сортировку по возрастанию и является значением по умолчанию, значение "descending" ("нисходящий") означает сортировку по убыванию. Если необходимо провести сортировку по нескольким критериям (например по фамилии и по имени), то в этом случае первым записывается элемент xsl:sort, выполняющий сортировку по фамилии, затем элемент xsl:sort, выполняющий сортировку по имени. Давайте рассмотрим все на простом примере: сортировка книжного каталога:



Входящий документ

<catalogtitle="Библиотека web-мастера">

<book title="XHTML 1.0" category="Языки разметки" author="Иванов И.Г."/>

<book title="Javascript для профессионалов" category="Языки скриптов" author="Семенов В.У."/>

<book title="Apache" category="Web-серверы" author="Фримен Г."/>

...


</catalog>

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

<xsl:template match="/">

<body>

<table border="1" width="80%" alibn="center">

<xsl:apply-templates select="catalog/book">

<xsl:sort select="@category" />

</xsl:apply-templates>

</table>

</body>

</xsl:template>

<xsl:template match="book">

<tr>

<td><xsl:value-of select="@title" /></td>

<td><xsl:value-of select="@author" /></td>

<td><xsl:value-of select="@category" /></td>

</tr>

</xsl:template>

Пример, который вы видите является несколько более "навороченным", чем приведенный в уроке, однако это не меняет сути - присутствие элемента xsl:sort в теле элемента xsl:apply-templates заставляет выбранное мноэество узлов сортироваться по значению выражения, указанного атрибутом select элемента xsl:sort. Очевидно, что сортировка происходит в алфавитном порядке по возрастанию значений выражения select.

Давайте теперь изменим направление сортировки - сделаем сортировку по убыванию значений выражения. Для этого изменим приведенный выше код следующим образом: добавим в элемент xsl:sort атрибут order со значением "descending". Вот так:

...


<xsl:sort order="descending" />

...


Видите, что направление сортировки поменялось.

Но давайте рассмотрим такой пример: книги в каталоге имеют стоимость, по которой и необходимо осуществлять сортировку. Например такие значения стоимостей книг, как "3.1", "20.5" бубут отсортированны по возрастанию так: "20.5", "3.1". Как упоминалось ранее, xsl:sort выполняет алфавитную (строковую) сортировку, а символ "3" больше символа "2", а значит "20.5" меньше "3.1". С точки зрения нашей логики получится абсолютный бред! Как же решить эту проблему? Решение кроется в использовании типа данных, указываемого атрибутом data-type. Если data-type="text" (по умолчанию), то происходит строковая сортировка; при data-type="number" сортировка числовая (то что нам надо):

...

<xsl:sort select="@price" data-type="number" />

...


Последний атрибут case-order определяет порядок сортировки по регистру символов, что может быть актуально при строковых сортировках. Значение "upper-first" (верхний регистр вперед) означает, что символы в в верхнем регистре будут рассмотрены и отсортированны раньше, чем символы нижнего регистра. Значение "lower-first" - наоборот: символы нижнего регистра рассматриваются и сортируются раньше. Например, при case-order="lower-first" строка "Пример" помещается перед строкой "пример".

В предыдущих примерах порядок строк в таблице полностью соответствовал группам тегов в XML-файле. Этот порядок можно изменять. Добавим в тег



атрибут order-by



Наша таблица примет вид (ex03-3.xml, ex03-3.xsl).



Более интересные результаты мы получим, если попытаемся отсортировать таблицу по столбцу "Number". Вначале попробуем сделать по аналогии с предыдущим примером - атрибут order-by="carMarka" заменим на order-by="carNumber". Результат приведен ниже  (ex03-4.xml, ex03-4.xsl).

Таблица действительно отсортирована по столбцу "номер", но это не числовая, а строковая сортировка! Для того, чтобы браузер воспринял значения как числа, ему необходимо об этом сказать, - вместо order-by="carNumber". необходимо написать order-by="number(carNumber)". Теперь мы получили правильный результат (ex03-5.xml, ex03-5.xsl).

Приведем теперь пример сортировки по нескольким столбцам. Различные элементы в атрибуте order-by должны разделяться символом ";" -   order-by=" carMarka ;number(carNumber) " (ex03-6.xml, ex03-6.xsl). Таблица приведена ниже.



Следующий пример работает только под управлением XML-парсера версии 3. В нем строки сортируются по одному столбцу - по марке автомобиля. Этот пример уже приводился выше, однако теперь мы используем новый синтаксис (ex03-7.xml, ex03-7.xsl).

Отметим разницу.

При использовании нового синтаксиса используется ссылка на другое пространство имен



Это очень важный момент, и его никогда нельзя упускать из виду.

Кроме того, мы убрали атрибут order-by в элементе xsl:for-each и добавили другой элемент

Если элемент xsl:sort присутствует в элементе xsl:for-each, то он всегда должен стоять сразу после элемента xsl:for-each. Синтаксис элемента xsl:sort достаточно очевиден. В нем используются два атрибута: атрибут order - способ сортировки (по возрастанию или по убыванию) и атрибут select - имя поля, по которому производится сортировка. Если нам нужно отсортировать по первому элементу, как в данном примере, то вместо " carMarka " можно было поставить точку - ".", для других элементов нужно указывать его имя, например "carColor", если нам нужно отсортировать записи по цвету машины. На самом деле атрибутов может быть пять - select, lang, data-type, order и case-order, но мы не будем здесь рассматривать все эти атрибуты, поскольку здесь мы не преследуем цель дать полное описание всех элементов, используемых в XSL, и их атрибутов.

Таблица результатов приведена ниже.

С использованием нового синтаксиса легко сменить сортировку по возрастанию на сортировку по убыванию (ex03-8.xml, ex03-8.xsl). Этот пример работает только под управлением XML-парсера версии 3.

Разница заключается в одной строке

Мы изменили значение атрибут order - значение ascending заменено на descending.

Таблица результатов приведена ниже.

Покажем теперь сортировку по нескольким полям (ex03-9.xml, ex03-9.xsl). Этот пример работает только под управлением XML-парсера версии 3.

В этом примере у нас фигурируют две строки с элементом



Строки вначале сортируются по марке автомобиля, а затем по их номерам. Обратите внимание - для того, чтобы сортировка выполнялась в числовой последовательности, в элемент xsl:sort мы добавили атрибут data-type. Таблица результатов приведена ниже.



Элемент XSL:IF - фильтр

Рассмотрим теперь способы фильтрации строк таблицы. Первый пример использует старый синтаксис. В нем условие фильтрации указывается непосредственно в атрибуте select (ex04-1.xml, ex04-1.xsl).

Ниже приведена строка, в которую мы внесли необходимые изменения.



И таблица результатов.



Вы видите, что в таблице остались только те автомобили, чей номер превышает 1000000, причем первым стоит Опель, чей номер меньше.

Все дальнейшие примеры в этом параграфе работают только под управлением XML-парсера версии 3.

Более гибкие возможности нам предоставляет новый синтаксис (ex04-2.xml, ex04-2.xsl). Обратите внимание - в новом синтаксисе атрибут order-by в элементе xsl:for-each не поддерживается, вместо него мы вставили два элемента xsl:sort.