ЛАБОРАТОРНАЯ РАБОТА 2

XSL-ТРАНСФОРМАЦИЯ XML-ДАННЫХ

В WEB-ПРИЛОЖЕНИЯХ

1. Цель работы

Целью работы является изучение технологий XSL-трансформации XML-данных, полученных из базы данных, в HTML-страницы Web-приложений.

2. Задачи

Задачами лабораторной работы являются овладение навыками извлечения информации из базы данных в XML-формате, построения XSL-таблиц стилей трансформации, программной реализации XSL-трансформации на основе классов серверных сценариев Web-приложений.

3. Теоретическая часть

Данные в формате XML. Технология XML – простой, стандартный способ взаимообмена структурированными текстовыми данными между компьютерными программами. Рост ее популярности связан отчасти с тем, что для прочтения XML-документов или для их создания достаточно простого текстового редактора, но это никак не умаляет основного назначения XML – служить средством связи между программными системами. В этом плане XML характеризуется следующими преимуществами:

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

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

– независимость от платформы. Возможность однозначно интерпретировать XML-данные на разных программных и аппаратных платформах.

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

НЕ нашли? Не то? Что вы ищете?

Если данные предназначены для человека, то это «нечто» может быть документом, который можно отобразить или напечатать: например, HTML-файлом, PDF-файлом или даже звуковым файлом. Конвертирование данных XML в HTML для отображения – вероятно, наиболее частое применение XSLT сегодня. Получив данные в формате HTML их легко отобразить с помощью любого браузера.

Для передачи данных между разными приложениями необходимо преобразовать их из модели, используемой одним приложением, в модель, используемую другим. Для преобразования XML-данных чаще всего используется технология XSLT (eXtensible Stylesheet Language for Transformations, расширяемый язык стилей для преобразований).

XSLT представляет собой мощную прикладную XML-технологию, которая может применяться везде, где есть два документа разной структуры. XSLT предоставляет высокоуровневые средства для манипуляции данными, которые хранятся в виде XML. Хотя XSLT не позиционируется как язык запросов для XML, можно смело сравнить его с языком SQL, в котором определяются запросы к реляционным базам данных.

XSLT-обработка включает обычно две стадии:

– первая стадия – структурное преобразование, при котором структура данных исходного XML-документа конвертируется в структуру, отражающую желаемый вывод;

– вторая стадия – форматирование, при котором новая структура выводится в желаемом формате, например, HTML или PDF.

XSL-таблицы стилей. Название «таблица стилей» присвоено документу, который определяет преобразование. Название отражает сущность процесса, который происходит при самом общем типе преобразования, выполняемого с помощью XSLT, а именно: определить стиль отображения информации в исходном документе, причем так, чтобы конечный документ содержал информацию исходного документа, дополненную информацией, которая управляет способом его отображения на некотором устройстве вывода.

Исходный документ и таблица стилей являются XML-документами. XSLT выполняет процесс преобразования, потому что вывод (конечный документ) и ввод (исходный документ) представляют собой объекты одного типа. Это дает прямые выгоды, например, сложное преобразование можно выполнить как ряд простых преобразований, кроме того, используя одну и ту же технологию, можно делать преобразования в любом направлении.

Структура таблицы стилей. Таблица стилей представляет собой корректный XML-документ, дерево XML-элементов. Корнем XSL-дерева является элемент stylesheet, также принадлежащий пространству имен XSLT.

В таблице стилей должен быть представлен хотя бы один шаблон (элемент template). В простейшем случае – это шаблон обработки корневого элемента, который «сработает» всегда, независимо от структуры исходных XML-данных.

Каждый шаблон содержит инструкции преобразования (XSL-инструкции) и разметку, которая должна быть без изменения скопирована в результирующий документ (конечные литеральные элементы).

В лабораторной работе используются два вида XSL-инструкций:

– xsl:value-of. Это XSL-инструкция, позволяющая получить значение элемента или атрибута исходного XML-документа. Элемент xsl:value-of содержит атрибут select, значение которого ­– это XPath-адрес элемента или атрибута, значение которого нужно получить.

– xsl:for-each. Это XSL-инструкция, формирующая цикл по множеству элементов исходного XML-документа. В качестве значения атрибута select элемента xsl:for-each указывается XPath-адрес множества XML-элементов исходного XML-документа.

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

Базы данных и XML. На практике часто возникает задача извлечения информации из базы данных в формате XML. Проще всего эта задача решается в СУБД корпорации Microsoft (например, SQL Server). Здесь для получения данных в формате XML традиционный Transact-SQL запрос SELECT дополняется опцией FOR XML. В других СУБД такие запросы обычно не поддерживаются. Для получения XML-данных используются либо дополнительные библиотеки, либо формирование DOM-объектов «вручную». Так или иначе получение XML-данных выполняется на уровне сценариев.

Запросы SELECT…FOR XML. В Microsoft SQL Server для получения данных в формате XML используется инструкция SELECT…FOR XML. С помощью этой инструкции возвращаемый набор данных можно было отформатировать в XML в трех различных режимах – RAW, AUTO и EXPLICIT.

Самый простой режим выборки данных в XML-формате – использование опции RAW. Для каждой строки результата создается элемент с именем row по умолчанию. Этот элемент можно переименовать, к результату выборки можно добавить корневой элемент и т. д.

В качестве примера рассмотрим использование инструкции SELECT…FOR XML RAW для получения информации о факультетах из таблицы «Факультет»:

SELECT ID, name

FROM Faculty

FOR XML RAW

Результат выборки представляет собой следующие XML-элементы:

<row ID="ФИРТ" name="информатики и робототехники"/>

<row ID="ФАД" name="авиационных двигателей"/>

Добавим корневой элемент Факультеты и переименуем каждый элемент row в элемент Факультет:

SELECT ID, name

FROM Faculty

FOR XML RAW('Факультет'), root('Факультет')

Результат выборки будет иметь следующий вид:

<Факультеты>

<Факультет ID="ФИРТ" name="информатики и робототехники"/>

<Факультет ID="ФАД" name="авиационных двигателей"/>

</Факультеты>

Режим FOR XML AUTO позволяет формировать простейший XML-фрагмент с вложенными элементами. Имена элементов и уровень вложенности генерируется на основе названия строк и столбцов таблиц и их связей в базах данных.

Для задания корневого элемента результата (независимо от используемой опции SELECT…FOR XML) используется конструкция ROOT, в качестве параметра передается имя корневого элемента.

В качестве примера рассмотрим предыдущий запрос на выборку данных о факультетах, но воспользуемся режимом FOR XML AUTO:

SELECT ID, name

FROM Faculty

FOR XML AUTO

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

<Faculty ID="ФИРТ" name="информатики и робототехники"/>

<Faculty ID="ФАД" name="авиационных двигателей"/>

Усложним запрос, добавив в него данные о специальностях в составе факультетов:

SELECT Faculty. ID, Faculty. name, Speciality. ID, Speciality. name

FROM Faculty, Speciality

WHERE Faculty. ID = Speciality. faculty

FOR XML AUTO

В результате выполнения запроса получим следующий результат:

<Faculty ID="ФИРТ" name="информатики и робототехники">

<Speciality ID="АСОИ" name="авт. сист. обр. инф. и упр."/>

<Speciality ID="ПИЭ" name="прикл. инф. в эк. "/>

</Faculty>

<Faculty ID="ФАД" name="авиационных двигателей">

<Speciality ID="АД " name="авиац. двиг. и энерг. уст."/>

<Speciality ID="ЭАТ" name="экспл. авиац. техн."/>

</Faculty>

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

select

(select

rtrim(Speciality. ID) as ID, rtrim(Speciality. name) as name from Speciality

where Faculty. ID=Speciality. faculty for xml auto, type), rtrim(Faculty. ID) as ID,

rtrim(Faculty. name) as name from Faculty for xml auto, type, root('University')

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

В некоторых ситуациях возможностей форматов FOR XML RAW и FOR XML AUTO недостаточно. Обычно такие ситуации возникают тогда, когда необходимо создать документ XML в заранее определенном формате. В этом случае можно использовать формат FOR XML EXPLICIT, который обладает наибольшей гибкостью при формировании XML-результата.

Например, чтобы получить такой результат

<Факультет ID = 'ФИРТ'>

  <Название>информатики и робототехники</Название>

  <Специальность ID = 'АСОИ'>автом. сист. обр. инф. и упр.</Специальность>

  <Специальность ID = 'ПИЭ'>прикл. инф. в эк.</Специальность>

</Факультет>

можно использовать следующий EXPLICIT-запрос:

SELECT 1 as Tag,

NULL as Parent,

Faculty. ID as [Факультьет!1!ID],

NULL as [Специальность!2!ID],

NULL as [Специальность!2!Назв]

FROM Faculty

UNION ALL

SELECT 2 as Tag,

1 as Parent,

Faculty. ID,

Speciality. ID,

Speciality. name

FROM Faculty, Speciality

WHERE Faculty. ID = Speciality. faculty

ORDER BY [Факультет!1!ID],[Специальность!2!Название]

FOR XML EXPLICIT

Подробное рассмотрение запросов SELECT…FOR XML выходит за пределы рассмотрения в данной лабораторной работе.

DOM-объекты. Технология XML DOM предоставляет простой и эффективный способ для работы с XML-данными. В основе DOM лежит одноименная спецификация консорциума W3C (Word Wide Web Consortium), в которой определены основные классы DOM-объектов, их свойства и методы. Наличие таких единых правил позволяет использовать XML DOM любым языком программирования и любой операционной системой.

DOM представляет собой дерево, отображающее структуру XML-документа (рис. 1). Программист может выполнять любые манипуляции с таким деревом – реализовывать навигацию по его структуре, добавлять, модифицировать или удалять определенные элементы. Все изменения, выполняемые в DOM-дереве, отражаются в XML-документе.

Рисунок 1 – Структура дерева DOM-объектов

Корневым элементом DOM-дерева является элемент documentElement. Он содержит один или несколько дочерних элементов (узлов), представляющих ветви дерева. Выделяют следующие виды DOM-узлов: элементы (element), атрибуты (attribute), текстовые узлы (text), комментарии (comment), инструкции по обработке (processing instruction).

XSL-трансформация в клиентских и серверных сценариях. На уровне сценариев (независимо от того, клиентские они или серверные) Web-приложений XSL-трансформация представляет собой применение XSL-таблиц стилей к экземплярам объектов XML DOM (рис. 2). Использование DOM-объектов обусловлено тем, что XSL-преобразование ориентировано на трансформацию данных в XML-формате.

Рисунок 2 – Схема применения XSL-трансформации в Web-сценариях

Использование DOM позволит выполнять ее независимо от того, как эти данные были получены – из файла, в виде потока данных, в результате запроса к базе данных и пр. Результат преобразования можно также представить разными способами – вывести на экран клиентского браузера (при трансформации XML → HTML), использовать для дальнейшей обработки (если используется трансформация вида XML → XML) или сохранить в файл.

XSL-трансформация в ASP.NET-сценариях. Для выполнения XSL-трансформации в сценариях используются два основных класса. Класс XmlDocument предоставляет программную реализацию DOM-объектов. В коде сценария экземпляр класса XmlDocument создается с помощью соответствующего конструктора:

XmlDocument dom = new XmlDocument();

Для того чтобы загрузить в экземпляр DOM-объекта XML-данные используются методы Load (при заполнении объекта данными из потока) и LoadXML (когда источником XML-данных является физический файл):

dom. Load(название потока данных);

dom. LoadXML(имя XML-файла);

Второй базовый класс трансформации в – XslTransform. Для задания его экземпляра также используется одноименный конструктор:

XslTransform xsl = new XslTransform();

Загрузка XSL-стилей в экземпляр класса XslTransform выполняется, как правило, из XSL-файла, физически размещенного на сервере. Для этого в используется метод Load, в качестве параметра которому передается путь к соответствующему файлу:

xsl. Load(Путь к файлу);

Собственно трансформация выполняется с помощью метода Transform класса XslTransform. В качестве параметров этому методу передаются DOM-объект, к которому применяется преобразование, дополнительные настройки трансформации и форма представления результата преобразования:

xsl. Transform(dom, null, Response. Output);

XSL-трансформация в PHP-сценариях. В PHP-сценариях базовыми классами XSL-трансформации являются классы DOM-объектов и XSL-спецификаций.

Для создания нового DOM-объекта в PHP используется класс DomDocument. При вызове конструктора этого класса ему можно передать два параметра – версию используемой XML-спецификации и кодировку XML-данных, например,

$xml = new DOMDocument('1.0');

Для создания нового элемента в дереве DOM используется метод createElement класса DomDocument. В качестве параметра этой функции передается имя соответствующего элемента. Так, к примеру, чтобы создать новый элемент с именем Root в экземпляре DOM-объекта с именем xml можно использовать следующий код:

$root = $xml->createElement('Root');

Однако элемент недостаточно просто создать – нужно еще добавить его в дерево элементов DOM-объекта. Для этого в PHP (как, впрочем, и в других языках программирования сценариев) используется метод appendChild класса DomDocument:

$xml->appendChild($root);

Для дополнения созданного XML-элемента атрибутами используется метод setAttributes класса Element. В качестве параметров этому методу передаются название и значение атрибута:

$elem->setAttribute($name,$value);

Для применения трансформации в PHP используется класс XSLTProcessor:

$xslt = new XSLTProcessor();

Для представления таблицы стилей используется DOM-объект (класс DomDocument), в который с помощью метода Load подгружается XSL-файл спецификации:

$xsl = new DomDocument;

$xsl->load(XSL-файл);

В класс XSLTProcessor таблица стилей передается из DOM-объекта с помощью функции importStylesheet:

$xslt->importStylesheet($xsl);

Для представления результатов трансформации используются либо метод transformToXML (для представления XML или HTML-результата), либо transformToDoc (для сохранения результата трансформации в файл). Например, для отображения в окне браузера результата трансформации используется метод transformToXML, в качестве параметра которому передается DOM-объект, к которому применяется преобразование:

echo $xslt->transformToXML($xml);

XSL-трансформация в JSP-сценариях. В JSP основной библиотекой для работы с XML-данными является библиотека javax. xml. parsers. В состав этого пакета входит несколько классов, два из которых в лабораторной работе используются:

– DocumentBuilder – это DOM-парсер, который создает объект класса org. w3c. dom. Document;

– DocumentBuilderFactory – класс, который создает DOM-парсеры.

Для того, чтобы создать DOM-объект, нужно воспользоваться классом Document, экземпляр которого можно получить следующим образом:

DocumentBuilderFactory dbf = DocumentBuilderFactory. newInstance();

DocumentBuilder db = dbf. newDocumentBuilder();

Document doc = db. newDocument();

Создание XML-элемента можно выполнить так:

Element elem = doc. createElement("elem");

Для создания XML-атрибута можно использовать такую программную конструкцию:

elem. setAttribute("name", "value");

С помощью метода appendChild можно добавить узел в элемент, например, так:

elem. appendChild(elem2);

doc. appendChild(elem);

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

TransformerFactory tFactory = TransformerFactory. newInstance();

Transformer transformer = tFactory. newTransformer(xsl);

Непосредственно преобразование выполняется с помощью метода transform с двумя параметрами – DOM-объект, к которому применяется преобразование, и объект или поток, куда должен быть записан результат трансформации:

transformer. transform(new DOMSource(doc), result);

4. Порядок выполнения работы

Предварительные замечания

В рамках лабораторной работы должно быть разработано Web-приложение «Успеваемость студентов», состоящее из двух Web-страниц (аналогичное тому, что было разработано в первой лабораторной работе). Каждая страница генерируется с помощью применения XSL-трансформации к XML-данным, полученным из базы данных «University».

Выполнение лабораторной работы должно быть осуществлено в два этапа:

– программирование XSL-таблиц стилей для генерации страниц Web-приложения;

– программирование серверных сценариев для получения XML-данных из базы данных и применения к ним стилей XSL-трансформации.

4.1. Программирование XSL-таблиц стилей

1. Создание XSL-спецификации трансформации Default. xsl

1.1.Создать новый файл в текстовом редакторе «Блокнот»

1.2. Сохранить файл под именем Default. xsl

2. Открыть файл Default. xsl в текстовом редакторе (или в любом другом редакторе)

3. Создать инструкцию по обработке XML:

<?xml version="1.0" encoding="windows-1251" ?>

4. Создать корневой элемент stylesheet

4.1. Создать открывающий тег stylesheet

<xsl:stylesheet>

4.2. Задать используемую версию XSL-спецификации. Для этого в открывающем теге xsl:stylesheet создать атрибут version со значением «1.0»:

version="1.0"

4.3. Задать пространство имен с URL «http://www. w3.org/1999/XSL/Transform» и префиксом xsl. Для этого создать в открывающем теге xsl:stylesheet следующий атрибут:

xmlns:xsl="http://www. w3.org/1999/XSL/Transform"

4.4. Создать закрывающий тег элемента stylesheet:

</xsl:stylesheet>

5. Создать шаблон обработки корневого элемента.

5.1. Внутри элемента xsl:stylesheet (между его открывающим и закрывающим тегами) ввести открывающий тег элемента template с префиксом xsl:

<xsl:template match="/">

5.2. Указать, что шаблон обрабатывает корень XML-дерева. Для этого ввести в открывающий тег элемента template атрибут match со значением «/»:

match="/"

5.3. Создать закрывающий тег элемента template:

</xsl:template>

6. Задать конечные литеральные элементы HTML-разметки XSL-спецификации. Для этого скопировать все HTML-разметку страницы Default. aspx из лабораторной работы 1 (без подстановки значений из базы данных) между открывающим и закрывающим тегами элемента xsl:template:

<HTML xmlns="http://www. w3.org/1999/xhtml" >

<HEAD>

<TITLE>Успеваемость студентов</TITLE>

<LINK href="images/style. css" rel="stylesheet" type="text/css"/>

</HEAD>

<BODY style="font-size: 12pt">

<form action="Browse. php" method="get" name="ff">

<TABLE class="pageborder" border="0" width="600">

<TR>

<TD width="100%">

<SPAN class="text1">Успеваемость</SPAN>

<BR/>

<SPAN class="text2">&#160; &#160; &#160; &#160; &#160; &#160; студентов</SPAN>

<BR/>

<HR class="line"/><HR class="line" width="70%" align="left"/>

</TD>

</TR>

<TR>

<TD style="height: 17px; text-align: right;" width="100%">

<SPAN style="color: #ff0000; font-size:13pt; font-family: 'Century Schoolbook'">Выбор &#160;</SPAN>

<SPAN style="color: #669999; font-size:13pt; font-family: 'Century Schoolbook'"><A href="javascript:document. ff. submit();" style="text-decoration: none">Просмотр</A></SPAN>

</TD>

</TR>

<TR>

<TD><BR/>

<TABLE align="center" width="550">

<TR height="50px" valign="top">

<TD style="width: 163px"><SPAN class="text3">Факультет</SPAN></TD>

<TD>

<select name="faculty" style="width: 350px">

<option value="0" selected="selected">Выбор факультета...</option>

</select>

</TD>

</TR>

<TR height="50px" valign="top">

<TD style="width: 163px"><SPAN class="text3">Специальность</SPAN></TD>

<TD>

<select name="spec" style="width: 350px">

<option value="0" selected="selected">Выбор специальности...</option>

</select>

</TD>

</TR>

<TR height="30px" valign="top">

<TD style="width: 163px"><SPAN class="text3">Группа</SPAN></TD>

<TD>

<select name="gr" style="width: 350px">

<option value="0" selected="selected">Выбор группы...</option>

</select>

</TD>

</TR>

</TABLE>

</TD>

</TR>

</TABLE>

</form>

</BODY>

</HTML>

7. Заполнить раскрывающийся список с идентификатором faculty результатом запроса (п. 10.5). Список должен отображать названия факультетов (поле name), а в качестве выбранных значений, передаваемых серверу, использовать их идентификаторы (поле id). Для этого после первого элемента раскрывающегося списка Faculty (строка <option value="0" selected="selected"> Выбор факультета... </option>) ввести код:

<xsl:for-each select="University/Faculty">

<option>

<xsl:attribute name="value">

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

</xsl:attribute>

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

</option>

</xsl:for-each>

8. Аналогичным образом заполнить раскрывающиеся списки «Специальность» (spec) и «Группа» (gr в формате «специальность-номер группы», например, ПИЭ-7).

9. Создание XSL-спецификации трансформации Browse. xsl

9.1.Создать новый файл в текстовом редакторе «Блокнот»

9.2. Сохранить файл под именем Browse. xsl

10. Открыть файл Browse. xsl в текстовом редакторе (или в любом другом редакторе)

11. Создать XML-инструкцию по обработке, корневой элемент xsl:stylesheet с указанием используемых версии XSL-спецификации и пространства имен, шаблон обработки корневого элемента (см. пп. 3–5).

12. Задать конечные литеральные элементы HTML-разметки XSL-спецификации. Для этого скопировать все HTML-разметку страницы Browse. aspx из лабораторной работы 1 (без подстановки значений из базы данных) между открывающим и закрывающим тегами элемента xsl:template:

<HTML xmlns="http://www. w3.org/1999/xhtml" >

<HEAD>

<TITLE>Успеваемость студентов</TITLE>

<LINK href="images/style. css" rel="stylesheet" type="text/css"/>

</HEAD>

<BODY style="font-size: 12pt">

<TABLE class="pageborder" border="0" width="600">

<TR>

<TD width="100%">

<SPAN class="text1">Успеваемость</SPAN>

<BR/>

<SPAN class="text2">&#160; &#160; &#160; &#160; &#160; &#160; студентов</SPAN>

<BR/>

<HR class="line"/><HR class="line" width="70%" align="left"/>

</TD>

</TR>

<TR>

<TD style="height: 17px; text-align: right;" width="100%">

<SPAN style="color: #669999; font-size:13pt; font-family: 'Century Schoolbook'">

<A href="Index. htm" style="text-decoration: none">Выбор</A> &#160;</SPAN>

<SPAN style="color: #ff0000; font-size:13pt; font-family: 'Century Schoolbook'">Просмотр</SPAN>

</TD>

</TR>

<TR>

<TD><BR/>

<TABLE width="500" align="center" class="headborder">

<TR>

<TD width="30%"><SPAN class="headtext">Студент</SPAN></TD>

<TD width="30%" align="center"><SPAN class="headtext">Дисциплина</SPAN></TD>

<TD width="20%" align="center"><SPAN class="headtext">Дата</SPAN></TD>

<TD width="20%" align="center"><SPAN class="headtext">Оценка</SPAN></TD>

</TR>

</TABLE>

<TABLE width="500" align="center" class="textborder">

<TR>

<TD width="30%"><SPAN class="tabletext"></SPAN></TD>

<TD width="30%" align="center"><SPAN class="tabletext"></SPAN></TD>

<TD width="20%" align="center"><SPAN class="tabletext"></SPAN></TD>

<TD width="20%" align="center"><SPAN class="tabletext"></SPAN></TD>

</TR>

</TABLE>

</TD>

</TR>

</TABLE>

</BODY>

</HTML>

13. Вывести в цикле сведения об успеваемости студентов заданной студенческой группы. Для этого в элементе TABLE (последний из приведенных в коде) код, описывающий строку (элемент TR и все его содержимое) поместить между открывающим и закрывающим тегами элемента xsl:for-each:

<xsl:for-each select="Uspev/Groups/Student/Uspev">

</xsl:for-each>

14. На каждой итерации цикла вывести значения ФИО студента, названия дисциплины, полученной оценки и даты сдачи. Для этого ввести инструкции VALUE-OF в соответствующих столбцах TD строки TR. Например, для вывода ФИО студента следует изменить строку, описывающую первый столбец таблицы, следующим образом:

<TD width="30%"><SPAN class="tabletext"><xsl:value-of select="../@fio"/></SPAN></TD>

Чтобы вывести название предмета, строку, описывающую второй столбец таблицы, следует изменить следующим образом:

<TD width="30%" align="center"><SPAN class="tabletext"><xsl:value-of select="@subject"/></SPAN></TD>

4.2. Программирование серверных сценариев

Технология ASP.NET и СУБД Microsoft SQL Server

1. Создать новый Web-сайт:

Пуск | Microsoft Visual Studio 2005 | Microsoft Visual Studio 2005

ф. Microsoft Visual Studio | File → New → Web Site… → ф. New Web Site → Visual Studio Installed Templates → выбр. Web Site →

Location → выбр. HTTP → http://имя_сервера(например, localhost)/Lab1_ASP

Language → выбр. Visual C#

2. Открыть для редактирования файл Default. aspx. cs:

ф. Solution Explorer | Default. aspx | Default. aspx. cs → пр. кн. мыши → выбр. Open

3. Подключить библиотеки для работы с базами данных (System. Data, System. Data. SqlTypes, System. Data. SqlClient), элементами управления (System. Web. UI, System. Web. UI. WebControls, System. Web. UI. WebControls. WebParts, System. Web. UI. HtmlControls) и XML-данными (System. Xml, System. Xml. Xsl, System. Data. SqlClient). Для этого после строки программного кода

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default. aspx. cs" Inherits="_Default"%>

Добавить следующие строки:

using System. Data;

using System. Data. SqlClient;

using System. Data. SqlTypes;

using System. Web. UI;

using System. Web. UI. WebControls;

using System. Web. UI. WebControls. WebParts;

using System. Web. UI. HtmlControls;

using System. Xml;

using System. Xml. Xsl;

4. Установить соединение с базой данных University.

4.1. Создать текстовую переменную constring, задающую параметры соединения с базой данных. Для этого между открывающей и закрывающей фигурными скобками функции Page_Load ввести следующий код:

string constring = "Data Source=GULYA;Initial Catalog=University;Integrated Security=True";

4.2. Создать экземпляр класса SqlConncection (соединение с базой данных), присвоить ему имя cn и передать параметры подключения из переменной constring:

SqlConnection cn = new SqlConnection(constring);

4.3. Создать экземпляр объекта SqlCommand под именем cmd в рамках экземпляра класса соединения cn:

SqlCommand cmd = cn. CreateCommand();

5. Разработать запрос на извлечение данных в XML-формате

5.1. Создать текстовую переменную sql, содержащую запрос на извлечение данных в формате XML:

string sql = "select (select (select rtrim(Groups. ID) as ID, rtrim(Groups. spec)+'-'+rtrim(Groups. number) as num from Groups where Speciality. ID=Groups. spec for xml auto, type), rtrim(Speciality. ID) as ID, rtrim(Speciality. name) as name from Speciality where Faculty. ID=Speciality. faculty for xml auto, type), rtrim(Faculty. ID) as ID, rtrim(Faculty. name) as name from Faculty for xml auto, type, root('University')";

5.2. Проверить работоспособность запроса. Для этого запустить среду Microsoft SQL Server Management Studio, выбрать базу данных University. Далее создать новый запрос, скопировать в него содержимое переменной sql и запустить запрос на выполнение. Результат должен иметь следующий вид:

<University>

<Faculty ID="ФАД" name="авиационных двигателей">

<Speciality ID="АД" name="авиац. двиг. и энерг. уст.">

<Groups ID="1" num="АД-1" />

<Groups ID="2" num="АД-2" />

</Speciality>

<Speciality ID="ЭАТ" name="экспл. авиац. техн.">

<Groups ID="3" num="ЭАТ-3" />

<Groups ID="4" num="ЭАТ-4" />

</Speciality>

</Faculty>

<Faculty ID="ФИРТ" name="информатики и робототехники">

<Speciality ID="АСОИ" name="авт. сист. обр. инф. и упр.">

<Groups ID="5" num="АСОИ-5" />

<Groups ID="6" num="АСОИ-6" />

</Speciality>

<Speciality ID="ПИЭ" name="прикл. инф. в эк.">

<Groups ID="7" num="ПИЭ-7" />

<Groups ID="8" num="ПИЭ-8" />

</Speciality>

</Faculty>

</University>

6. В коде выполнить запрос на извлечение XML-данных. Для этого ввести следующий код:

mandText = sql;

mandType = CommandType. Text;

cmd. Connection. Open();

7. Записать результат XML-запроса в DOM-объект

7.1. Создать экземпляр класса XmlReader и присвоить ему имя r. Заполнить объект XmlReader данными из результата запроса – экземпляра объекта SqlCommand (cmd):

System. Xml. XmlReader r = cmd. ExecuteXmlReader();

7.2. Создать новый DOM-объект и присвоить ему имя xd:

XmlDocument xd = new XmlDocument();

7.3. Заполнить DOM-объект xd данными из объекта XmlReader (переменная r):

xd. Load(r);

8. Создать экземпляр объекта XslTransform для выполнения XSL-преобразования и присвоить ему имя docXsl:

XslTransform docXsl = new XslTransform();

9. Загрузить в объект XslTransform (переменную docXsl) таблицу стилей из файла Default. xsl.

docXsl. Load(Server. MapPath("Default. xsl"));

10. Выполнить преобразование и отобразить его результат на экране:

docXsl. Transform(xd, null, Response. Output);

11. Создать новую страницу Web-сайта:

Lab1_ASP - Microsoft Visual Studio |

ф. Solution Explorer | кл. пр. кн. мыши на названии проекта → Add New Item…

ф. Add New Item | → Visual Studio Installed Templates → выбр. Web Form →

Name → ввести «Browse. aspx»

Language → выбр. Visual C#

12. Открыть для редактирования файл Default. aspx. cs:

ф. Solution Explorer | Default. aspx | Default. aspx. cs → пр. кн. мыши → выбр. Open

11. Подключить дополнительные библиотеки (см. п. 3).

12. Установить соединение с базой данных University (см. п. 4).

13. Разработать запрос на извлечение данных об успеваемости в XML-формате и проверить его работоспособность (см. п. 5). В качестве текста запроса использовать:

select (select (select rtrim(Uspev. ID) as ID, rtrim(Uspev. subject) as subject, rtrim(Uspev. ocenka) as ocenka, CONVERT(CHAR(25),data,104) as data from Uspev where Student. zk=Uspev. student for xml auto, type), rtrim(Student. zk) as zk, rtrim(Student. fio) as fio, rtrim(Student. gr) as gr from Student where Groups. ID=Student. gr for xml auto, type), rtrim(Groups. ID) as ID, rtrim(Groups. number) as number, rtrim(Groups. spec) as spec from Groups for xml auto, type, root('Uspev')

Результат выполнения запроса должен иметь следующий вид:

<Uspev>

<Groups ID="1" number="1" spec="АД" />

<Groups ID="2" number="2" spec="АД" />

<Groups ID="3" number="3" spec="ЭАТ" />

<Groups ID="4" number="4" spec="ЭАТ" />

<Groups ID="5" number="5" spec="АСОИ" />

<Groups ID="6" number="6" spec="АСОИ" />

<Groups ID="7" number="7" spec="ПИЭ">

<Student zk="111111" fio="" gr="7">

<Uspev ID="1" subject="Математика" ocenka="5" data="06.12.2009" />

<Uspev ID="14" subject="Физика" ocenka="3" data="08.12.2009" />

<Uspev ID="17" subject="Химия" ocenka="5" data="10.12.2009" />

</Student>

<Student zk="222222" fio="" gr="7">

<Uspev ID="2" subject="Математика" ocenka="4" data="06.12.2009" />

<Uspev ID="15" subject="Физика" ocenka="4" data="08.12.2009" />

<Uspev ID="18" subject="Химия" ocenka="4" data="10.12.2009" />

</Student>

<Student zk="333333" fio="" gr="7">

<Uspev ID="3" subject="Математика" ocenka="3" data="06.12.2009" />

<Uspev ID="16" subject="Физика" ocenka="5" data="08.12.2009" />

<Uspev ID="19" subject="Химия" ocenka="3" data="10.12.2009" />

</Student>

</Groups>

<Groups ID="8" number="8" spec="ПИЭ" />

</Uspev>

14. Выполнить запрос (см. п. 6), записать его XML-результат в DOM-объект (см. п. 7) и применить к ему XSL-преобразование из файла Browse. xsl (см. п. 8–10).

15. Проверить работоспособность созданного Web-приложения. Для этого перейти на страницу Lab1_ASP - Microsoft Visual Studio | Default. aspx и нажать сочетание клавиш [Ctrl+F5].

Технология PHP и СУБД MySQL

1. Создать директорию, в которой будут размещены файлы Web-приложения, и назвать ее Lab1_PHP. Разместить созданную папку по адресу C:/Program Files/EasyPHP/WWW.

2. В текстовом редакторе (например, в «Блокноте») создать новый файл и сохранить его под именем Index. php.

3. Открыть файл Index. php в текстовом редакторе (например, в «Блокноте»).

4. Создать сценарий PHP. Для этого ввести следующий код:

<?php

?>

5. Установить кодировку UTF-8 представления результирующих страниц. Для этого между открывающей (<?php) и закрывающей (?>) угловыми скобками ввести следующий код[1]:

$def_charset = "Content-Type: text/html; charset=utf-8";

header($def_charset);

6. Установить соединение с базой данных MySQL. Для этого в сценарий PHP ввести следующий код:

$link = @mysql_connect("localhost", "root") or die("Невозможно соединиться с сервером");

$db=@mysql_select_db("university") or die("Нет такой базы данных");

7. Установить кириллическую кодировку (cp-1251) для корректной передачи и получения данных из базы данных. Для этого в сценарий ввести следующий код:

@mysql_query("SET SESSION character_set_results = cp1251;");

@mysql_query("SET SESSION Character_set_client = cp1251;");

@mysql_query("SET SESSION Character_set_results = cp1251;");

@mysql_query("SET SESSION Collation_connection = cp1251_general_ci;");

@mysql_query("SET SESSION Character_set_connection = cp1251;");

8. Создать текстовые переменные для хранения текстов запросов к таблицам «Факультет» (Faculty), «Специальность» (Speciality) и «Группа» (Groups). Для этого в сценарий ввести следующий код:

$f_query="select `ID`, `name` from `faculty`";

$sp_query="select `ID`, `name`, `faculty` from `speciality`";

$gr_query="SELECT `ID`, concat(rtrim(`spec`),'-', rtrim(`number`)) as `num`, `spec` FROM `groups`";

9. Создать функцию добавления нового элемента в DOM-объект.

9.1. Создать новую функцию с названием createXMLElem с входными параметрами dom (какой DOM-объект используется), parent (к какому существующему элементу добавить новый элемент), row (какая используется строка из запроса к базе данных), name (под каким именем создать элемент). Для этого в сценарий ввести следующий код:

function createXMLElem($dom, $parent, $row, $name)

{

}

9.2. Создать новый XML-элемент с именем из переменной name относительно заданного DOM-объекта. Занести новый элемент в переменную $elem. Для этого между открывающей и закрывающей угловыми скобками из предыдущего пункта ввести следующий код:

$elem = $dom->createElement($name);

9.3. Добавить элемент из переменной elem в дерево DOM-объекта после элемента из переменной parent и переопределить переменную elem как часть DOM-объекта. Для этого добавить в функцию следующий код:

$elem = $parent->appendChild($elem);

9.4. Для элемента elem создать атрибуты, соответствующие столбцам из запроса к базе данных. Для этого представить строку запроса (переменная row) как ассоциативный массив вида «название столбца => значение». Ввести в функцию следующий код:

foreach ($row as $fieldname => $fieldvalue)

{

$val = iconv('windows-1251', 'utf-8', $fieldvalue);

$elem->setAttribute($fieldname,$val);

}

9.5. Указать, что функция в результате своего выполнения должна возвращать содержимое переменной elem. Для этого ввести в функцию следующий код:

return $elem;

10. Создать новый DOM-объект и поместить его в переменную xml. Для этого ввести в PHP-сценарий следующий код:

$xml = new DOMDocument('1.0');

11. Создать корневой элемент University DOM-объекта xml и поместить его в переменную root. Для этого ввести в сценарий следующий код:

$root = $xml->createElement('University');

$root = $xml->appendChild($root);

12. Выполнить запрос на извлечение данных о факультетах, текст которого хранится в переменной f_query. Для этого ввести в сценарий следующий код:

$f=mysql_query($f_query);

13. Представить результат запроса (п. 12) в форме ассоциативного массива с названиями индексов, соответствующими названиям столбцов запроса (ID и name). Организовать цикл по элементам полученного массива. Для этого ввести в сценарий следующий код:

while($f_row = mysql_fetch_assoc($f))

{

}

14. С помощью функции createXMLElem создать в цикле XML-элемент Faculty и поместить его в корневой элемент (root) DOM-объекта xml. Результат поместить в переменную f_elem. Для этого между открывающей и закрывающей фигурными скобками из предыдущего пункта ввести следующий код:

$f_elem = createXMLElem($xml, $root, $f_row, 'Faculty');

15. Занести значение поля ID текущей итерации цикла по факультетам в переменную f1. Для этого после строки из предыдущего пункта до закрывающей фигурной скобки ввести следующий код:

$f1 = $f_row['ID'];

16. Выполнить запрос на извлечение данных о специальностях, текст которого хранится в переменной sp_query. Для этого после строки из предыдущего пункта до закрывающей фигурной скобки ввести следующий код:

$sp=mysql_query($sp_query);

17. Представить результат запроса (п. 16) в форме ассоциативного массива с названиями индексов, соответствующими названиям столбцов запроса (ID, name и faculty). Организовать цикл по элементам полученного массива внутри цикла while из п. 13. Для этого ввести в сценарий следующий код:

while($s_row = mysql_fetch_assoc($sp))

{

}

18. Занести значение поля faculty текущей итерации цикла по специальностям в переменную f2. Для этого после строки из предыдущего пункта до закрывающей фигурной скобки ввести следующий код:

$f2 = $s_row['faculty'];

19. Проверить равенство значений переменных f1 и f2, т. е. определить, относится ли специальность текущей итерации цикла по специальностям (п. 17) к факультету из текущей итерации цикла по факультетам (п. 13):

if($f1==$f2)

{

}

20. В случае выполнения условия равенства с помощью функции createXMLElem создать в цикле XML-элемент Speciality и поместить его в элемент f_elem, соответствующего факультету из текущей итерации цикла. Для этого между открывающей и закрывающей фигурными скобками из предыдущего пункта ввести следующий код:

$s_elem = createXMLElem($xml, $f_elem, $s_row, 'Speciality');

21. Занести значение поля ID текущей итерации цикла по специальностям в переменную sp1. Для этого после строки из п. 19 до закрывающей фигурной скобки ввести следующий код:

$s1 = $s_row['ID'];

22. Аналогичным образом (см. пп. 16–21) организовать цикл по студенческим группам, на каждой итерации выполнять сравнение значения поля spec со значением переменной s1 и формировать элемент Groups, вложенный в элемент Speciality DOM-объекта xml:

$gr=mysql_query($gr_query);

while($g_row = mysql_fetch_assoc($gr))

{

$s2 = $g_row['spec'];

if($s1==$s2)

{

$g_elem = createXMLElem($xml, $s_elem, $g_row, 'Groups');

}

}

23. Вывести в файл newfile. xml полученную XML-иерархию. Для этого после завершения всех циклов ввести следующий код:

echo $xml->save("newfile. xml");

24. Проверить работоспособность созданного PHP-сценария (как в лабораторной работе 1). Результат, представленный в файле, должен иметь следующий вид:

<University>

<Faculty ID="ФАД" name="авиационных двигателей">

<Speciality ID="АД" name="авиац. двиг. и энерг. уст.">

<Groups ID="1" num="АД-1" />

<Groups ID="2" num="АД-2" />

</Speciality>

<Speciality ID="ЭАТ" name="экспл. авиац. техн.">

<Groups ID="3" num="ЭАТ-3" />

<Groups ID="4" num="ЭАТ-4" />

</Speciality>

</Faculty>

<Faculty ID="ФИРТ" name="информатики и робототехники">

<Speciality ID="АСОИ" name="авт. сист. обр. инф. и упр.">

<Groups ID="5" num="АСОИ-5" />

<Groups ID="6" num="АСОИ-6" />

</Speciality>

<Speciality ID="ПИЭ" name="прикл. инф. в эк.">

<Groups ID="7" num="ПИЭ-7" />

<Groups ID="8" num="ПИЭ-8" />

</Speciality>

</Faculty>

</University>

25. Применить к полученным XML-данным XSL-преобразование из таблицы стилей Default. xsl.

25.1. Создать объект XsltProcessor с именем xslt. Для этого ввести следующий код:

$xslt = new XSLTProcessor();

25.2. Загрузить в объект XsltProcessor таблицу стилей. Для этого ввести следующий код:

$xsl = new DomDocument;

$xsl->encoding="utf-8";

$xsl->load('x. xsl');

$xslt->importStylesheet($xsl);

25.3. Применить преобразование к DOM-объекту xml и отобразить его результат на экране:

echo $xslt->transformToXML($xml);

26. В папку Lab1_PHP, содержащую файлы Web-приложения, добавить новый файл с именем Browse. php.

27. Создать сценарий PHP (п. 4), установить кодировку (п. 5) и соединение с базой данных (пп. 6–7).

28. Создать функцию createXMLElem добавления нового XML-элемента в иерархию элементов DOM-объекта (п. 9).

29. Создать переменную gr и записать в нее значения параметра gr, переданного со страницы Index. php:

$gr = $_POST['gr'];

30. Создать текстовые переменные для хранения текстов запросов к таблицам «Группы» (Groups), «Студент» (Student) и «Успеваемость» (Uspev). Для этого в сценарий ввести следующий код:

$gr_query="SELECT `ID`, `number`, `spec` FROM `groups` where `ID`=".$g;

$st_query="SELECT `zk`, `fio`, `gr` FROM `student`";

$us_query="SELECT `student`, `subject`, `ocenka`, `data` FROM `Uspev`";

31. Создать новый DOM-объект с именем xml и корневым элементом Uspev (пп. 10–11).

32. Заполнить корневой элемент DOM-объекта XML-данными в формате «Группа–Студент–Успеваемость» (Groups–Student–Uspev) (пп. 12–22).

33. Вывести в файл newfile. xml полученную XML-иерархию. Для этого после завершения всех циклов ввести следующий код:

echo $xml->save("newfile. xml");

34. Проверить работоспособность созданного PHP-сценария (как в лабораторной работе 1). Результат, представленный в файле, должен иметь следующий вид:

<Uspev>

<Groups ID="1" number="1" spec="АД" />

<Groups ID="2" number="2" spec="АД" />

<Groups ID="3" number="3" spec="ЭАТ" />

<Groups ID="4" number="4" spec="ЭАТ" />

<Groups ID="5" number="5" spec="АСОИ" />

<Groups ID="6" number="6" spec="АСОИ" />

<Groups ID="7" number="7" spec="ПИЭ">

<Student zk="111111" fio="" gr="7">

<Uspev ID="1" subject="Математика" ocenka="5" data="06.12.2009" />

<Uspev ID="14" subject="Физика" ocenka="3" data="08.12.2009" />

<Uspev ID="17" subject="Химия" ocenka="5" data="10.12.2009" />

</Student>

<Student zk="222222" fio="" gr="7">

<Uspev ID="2" subject="Математика" ocenka="4" data="06.12.2009" />

<Uspev ID="15" subject="Физика" ocenka="4" data="08.12.2009" />

<Uspev ID="18" subject="Химия" ocenka="4" data="10.12.2009" />

</Student>

<Student zk="333333" fio="" gr="7">

<Uspev ID="3" subject="Математика" ocenka="3" data="06.12.2009" />

<Uspev ID="16" subject="Физика" ocenka="5" data="08.12.2009" />

<Uspev ID="19" subject="Химия" ocenka="3" data="10.12.2009" />

</Student>

</Groups>

<Groups ID="8" number="8" spec="ПИЭ" />

</Uspev>

35. Применить к полученным XML-данным XSL-преобразование из таблицы стилей Browse. xsl (п. 25).

36. Протестировать полученное Web-приложение (см. лабораторную работу 1).

Технология JSP и СУБД MySQL

1. Запустить визуальную среду Eclipse Europe

Пуск | Программы | Eclipse

2. Создать новый проект

File → New → Web → Dynamic Web Project

3. Присвоить проекту имя Lab1_JSP

name → Lab1_JSP

4. Настроить Web-сервер для нового Web-приложения

Вкладка Servers → кл. пр. кн. мыши | выбр. New → Server →

ф. New Server | выбр. Apache Tomcat Server → кн. Finish

5. Добавить в проект новую JSP-страницу

ф. Project Explorer | Lab1_JSP | кл. пр. кн. мыши → выбр. New → JSP |

ф. New JavaServer Page | File name ← Default | удалить весь код элемента HTML

6. Установить использование кириллической кодировки. Для этого изменить инструкцию по обработке страницы page следующим образом:

<%@ page language="java" contentType="text/html; charset=windows-1251"

pageEncoding="windows-1251"%>

7. Подключить библиотеки для работы с базой данных:

<%@page import="java. sql.*"%>

<%@page import="java. io.*"%>

<%@page import="java. util.*"%>

8. Подключить библиотеки для работы с XML-данными:

<%@ page import="javax. xml. parsers. DocumentBuilderFactory"%>

<%@ page import="javax. xml. parsers. DocumentBuilder"%>

<%@ page import="org. w3c. dom.*"%>

<%@ page import="javax. xml. parsers.*"%>

9. Подключить библиотеки для выполнения XSL-трансформации:

<%@ page import="javax. xml. transform.*"%>

<%@ page import="javax. xml. transform. dom.*"%>

<%@ page import="javax. xml. transform. stream.*"%>

10. Ввести открывающий тег сценария <%.

11. Установить соединение с базой данных University.

11.1 Создать экземпляр класса драйвера взаимодействия с СУБД MySQL

<%

Class. forName("com. mysql. jdbc. Driver").newInstance();

%>

11.2. Задать текстовую переменную для хранения параметров соединения с базой данных

String connectionURL = "jdbc:mysql:/виртуальный путь к базе данных?user=пользователь;password=пароль";

11.3. Создать пустые объекты соединения (Connection) и запроса (Statement)

Connection conn = null;

Statement statement = null;

11.4. Установить соединение с базой данных MySQL:

conn = DriverManager. getConnection(connectionURL, "root", "");

11.5. Создать и настроить объект запроса:

statement = conn. createStatement();

conn. setReadOnly(true);

12. Выполнить запрос к таблице Faculty (Факультет) для получения данных о факультетах из базы данных. Для этого ввести в сценарий PHP следующий код:

ResultSet rs = conn. createStatement().executeQuery("SELECT * FROM faculty");

13. Создать экземпляр класса DocumentBuilderFactory:

DocumentBuilderFactory dbf = DocumentBuilderFactory. newInstance();

14. На основе класса DocumentBuilderFactory создать новый DOM-парсер:

DocumentBuilder db = dbf. newDocumentBuilder();

15. Создать экземпляр класса Document – новый DOM-объект:

Document doc = db. newDocument();

16. Создать новый XML-элемент University:

Element elem = doc. createElement("University");

17. Создать новый узел nd и добавить его в качестве корневого в дерево DOM-объекта doc:

Node nd =doc. appendChild(elem);

18. Построить цикл по результату запроса данных о факультетах:

while (rs. next()) {

19. Добавить к корневому элементу University элемент Faculty

19.1. Создать элемент Faculty:

elem = doc. createElement("Faculty");

19.2 Создать в элементе Faculty атрибут ID и записать в него значение одноименного поля таблицы базы данных:

elem. setAttribute("ID",rs. getString("id"));

19.3 Создать в элементе Faculty атрибут name и записать в него значение одноименного поля таблицы базы данных:

elem. setAttribute("name",rs. getString("name"));

19.4 Добавить элемент Faculty в иерархию дочерних элементов корневого элемента DOM-объекта:

nd. appendChild(elem);

20. Создать строковую переменную f1 и занести в нее значение атрибута ID:

String = rs. getString("id");

21. Выполнить запрос к таблице Speciality (Специальность) для получения данных о специальностях из базы данных. Для этого ввести в сценарий PHP следующий код:

ResultSet rs2 = conn. createStatement().executeQuery("SELECT * FROM speciality");

22. Построить цикл по результату запроса данных о специальностях:

while (rs2.next())

{

23. Создать строковую переменную f2 и занести в нее значение атрибута faculty:

String f2 = rs2.getString("faculty");

24. Создать строковую переменную s1 и занести в нее значение атрибута ID:

String s1 = rs2.getString("id");

25. Проверить, равны ли значения переменных f1 и f2 (относится ли текущая специальность к текущему факультету):

if(f1.equals(f2))

{

26. Добавить к элементу Faculty элемент Speciality (см. п. 19):

Element elem2 = doc. createElement("Speciality");

elem2.setAttribute("ID",rs2.getString("id"));

elem2.setAttribute("name",rs2.getString("name"));

elem2.setAttribute("faculty",rs2.getString("faculty"));

elem. appendChild(elem2);

27. Аналогичным образом в цикле по результату запроса данных о группах создать элемент Groups:

ResultSet rs3 = conn. createStatement().executeQuery("SELECT * FROM groups");

while (rs3.next())

{

String s2 = rs3.getString("spec");

if(s1.equals(s2))

{

Element elem3 = doc. createElement("Groups");

elem3.setAttribute("ID",rs3.getString("id"));

elem3.setAttribute("num",rs3.getString("spec")+"-"+rs3.getString("number"));

elem3.setAttribute("spec",rs3.getString("spec"));

elem2.appendChild(elem3);

}

}

}

}

}

28. Определить расположение таблицы стилей Index. xsl.

28.1 Определить расположение файла index. jsp

String ls_path = request. getServletPath();

28.2 Определить директорию, в которой расположен файл index. jsp

ls_path = ls_path. substring(0,ls_path. indexOf("index. jsp"));

28.3 Сформировать путь к файлу Index. xsl

String ls_xsl = application. getRealPath(ls_path+"Index. xsl");

29. Загрузить XSL-таблицу стилей Index. xsl:

StreamSource xsl = new StreamSource(new File(ls_xsl));

30. Инициализировать выходной поток данных для представления результата трансформации:

StreamResult result = new StreamResult(out);

31. Создать экземпляр класса TransformerFactory и загрузить в него таблицу стилей из потока xsl:

TransformerFactory tFactory = TransformerFactory. newInstance();

Transformer transformer = tFactory. newTransformer(xsl);

32. Выполнить XSL-трансформацию:

transformer. transform(new DOMSource(doc), result);

33. Открыть в любом редакторе файл Browse. xsl.

34. Установить кириллическую кодировку страницы (см. п. 6), подключить библиотеки для работы с базами данных (см. п. 7), с XML-данными (см. п. 8) и выполнения XSL-трансформации (см. п. 9).

35. Ввести открывающий тег сценария <%.

36. Установить соединение с базой данных University (см. п. 11).

37. Выполнить запрос к таблице Groups (Группы) для получения данных о группе в соответствии с параметром, переданным со страницы Index. jsp:

ResultSet rs = conn. createStatement().executeQuery("SELECT * FROM groups WHERE ID="+request. getParameter("gr"));

38. Создать экземпляр DOM-объекта (см. п. 13–15).

39. Создать XML-иерархию следующего вида:

<Uspev>

<Groups ID="ID" number="number" spec="spec">

<Student zk="zk" fio="fio" gr="gr">

<Uspev ID="id" subject="subject" ocenka="ocenka" data="data" />

</Student>

</Groups>

</Uspev>

Корневым является элемент Uspev, который содержит дочерние элементы Groups, каждый из которых, в свою очередь, – элементы Student со вложенными элементами Uspev (отличными от корневого).

40. Загрузить таблицу стилей Browse. xsl (см. пп. 28, 29).

41. Выполнить XSL-трансформацию (см. пп. 30–32).

42. Протестировать полученное Web-приложение (см. лабораторную работу 1).

5. Контрольные вопросы

1. Каковы преимущества XML-представления данных?

2. Что такое XSL-таблица стилей?

3. Какова структура XSL-таблицы стилей?

4. Как использовать запросы SELECT…FOR XML?

5. Что такое DOM?

6. Как выполняется преобразование в клиентских и серверных сценариях?

6. Содержание и оформление отчета

Отчет должен содержать:

– титульный лист, название и цель работы;

– вариант задания;

– листинг программного кода;

– скриншоты результатов работы Web-приложения с различными вариантами запросов;

– выводы по работе.

[1] Весь последующий код вводится там же, между открывающей (<?php) и закрывающей (?>) угловыми скобками сценария.