Лабораторная работа № 7 Изучение возможностей XML-СУБД Sedna по созданию и ведению баз данных 1. Цель работы Целью работы является изучение возможностей XML-СУБД Sedna по созданию и ведению XML-ориентированных баз данных. 2. Задачи Задачами лабораторной работы являются овладение навыками создания и заполнения XML-документов, запуска СУБД Sedna и создания новых баз данных в ней, загрузки XMLданных в базу данных из файла, программирования запросов XQuery, программных технологий реализации XSL-таблиц стилей для трансформации XML-данных. 3. Теоретическая часть XML – Extensible Markup Language – переводится как «расширяемый язык разметки». Здесь разметка – это задание структуры данных в текстовых документах. Расширяемость языка в данном случае означает, что в язык можно вводить собственные обозначения, с помощью которых выполняется разметка. Иными словами, в XML можно вводить свои собственные теги разметки, а не пользоваться теми, которые определены разработчиками языка. Более конкретно XML можно определить как язык для представления данных в виде деревьев. Это означает, что разметка документа задает некоторую иерархию фрагментов размечаемого текста. Элемент XML-документа – это то, что заключено между открывающим и соответствующим закрывающим тегами. Имя элемента задается именем тега. Внутри элемента могут располагаться текстовые фрагменты и другие элементы. В документе может быть несколько элементов с одинаковыми именами. Пустой элемент ничего не содержит внутри себя: <поставка></поставка>. Его можно обозначить кратко с помощью самозакрывающегося тега: <поставка/>. Элемент может иметь несколько атрибутов. Разделенный пробелами список атрибутов элемента записывается в его открывающем теге после имени. Каждый атрибут имеет имя атрибута, за которым через знак равенства следует строковое значение атрибута, заключенное в кавычки или апострофы. Важная особенность имен элементов и атрибутов – чувствительность к регистру. Например, <студент/>, <Студент/> и <СТУДЕНТ/> – это разные элементы. XML-СУБД. СУБД, работающие с XML данными, принято подразделять на две категории: прирожденные XML-СУБД (native XML DBMS, NXD), например «Tamino» Softwahre AG, и СУБД, поддерживающие XML (XML-enabled DBMS), например, SQL Server. Разница между ними состоит, во-первых, в полноте функциональных возможностей, поддерживаемых на логическом уровне представления и манипулирования XML данными и, во-вторых, в организации физического хранения (индексация и минимизация количества операций ввода-вывода), оптимизированного именно для XML данных. Понятие Native XML Database было введено для отличия, что данный тип баз данных основан на использовании внутреннего представления XML в отличие от XML-надстроек над существующими реляционными базами данных (XML enabled DB), такими как Oracle, PosgreSQL, MS SQL Server, в которых реализована XML-надстройка (XML-SQL) в соответствии со стандартом доступа SQL-2003. 1 Основным требованием к XML native DB (NXD) является использование внутреннего представления (иногда употребляют – бинарное) DOM XML в базе данных. Некоторые из направлений возможного применения NXD: – использование в веб-службах; – генерация суммарных отчетов данных из XML; – поиск релевантных документов в слабоструктурированных данных; – публикация данных для Web непосредственно в XHTML; – объединение нескольких XML-документов, формирование сводных документов. Прирожденные XML-СУБД обязательно определяют (логическую) модель XMLдокумента – в отличие от данных, содержащихся в этом самом документе – и сохраняет и извлекает документы в соответствии с этой моделью. Прирожденные XML-СУБД хранят XML-документы, как единое целое, и создают модель, подобную XML или одной из XML-технологий, например Infoset или DOM. Эта модель включает произвольные уровни вложенности и сложности, а также полную поддержку смешанных и слабоструктурированных данных. Эта модель автоматически отображается с помощью NXD в базовый механизм хранения. Это отображение обеспечит поддержку заданную XML-модель данных. Фундаментальная единица (логического) хранения в прирожденные XML-СУБД – XMLдокумент (в то время как в реляционной базе данных – запись) Sedna – российская прирожденная XML-СУБД, разрабатываемая исследовательской группой Modis в Институте системного программирования РАН. Текущая реализация Sedna базируется на спецификациях языка XQuery 1.0 и его модели данных. Модель данных XML является иерархической, поэтому иерархические данные представляют собой естественный вариант использования прирожденных XML-СУБД. XMLориентированная СУБД Sedna призвана решать задачи хранения большого объема XMLданных (до 1Гб и более) и эффективного управления этими данными, включая задачи поиска, изменения и трансформации данных. Разработка Sedna не основана на использовании какой-либо существующей системы управления базами данных. Вместо того, чтобы создавать некоторую надстройку над существующей СУБД, систему управления XML-данными разрабатывали с нуля. В общей архитектуре СУБД Sedna выделено несколько компонентов. Регулятор (governer) служит «управляющим центром» системы. Все остальные компоненты регистрируются у регулятора, который «знает», с какими базами данных работает система, и отслеживает выполнение транзакций. Слушатель (listener) создает для каждого нового авторизованного клиента экземпляр компонента подключение (connection) и устанавливает между ними прямую связь. В компоненте подключения инкапсулируется сеанс клиента. Для каждой заявки клиента «начать транзакцию» («begin transaction») его компонент подключения создает экземпляр компонента транзакция (transaction). В этом компоненте инкапсулируются компоненты выполнения запросов: парсер (parser), оптимизатор (optimizer) и исполнитель (executor). В СУБД Sedna для общения клиентов с сервером используется протокол обмена сообщениями, базирующийся на механизме сокетов TCP/IP. Этот протокол открыт и предназначается для реализации высокоуровневых интерфейсов прикладного программирования (API) для связи с различными языками программирования. К настоящему времени разработаны драйверы, реализующие API для языков Java и Scheme. Для работы с СУБД Sedna обычно используется инструмент командной строки (в случае реализации для операционной системы Windows). Для запуска СУБД используется команда se_gov, которая запускает одноименный exe-файл в папке BIN установочной директории Sedna. Здесь важно отметить, что установка Sedna является довольно простой – достаточно скачать дистрибутив СУБД с официального сайта (в виде архива) и развернуть его на локальной машине. По сути, вся структура СУБД представлена иерархией файлов и 2 директорий такого архива – здесь хранятся как конфигурационные файлы СУБД (метаданные), так и информация, хранящаяся в базе данных (как правило, эти данные представлены в директории Data). Создание новой базы данных выполняется посредством команды se_cdb (сокращение от sedna_create database), в качестве аргумента которой передается имя создаваемой базы данных. Работа с базой данных возможна только в том случае, если она является активной (находится в состоянии running). Поэтому для выполнения дальнейших манипуляций с базой данных (независимо от того, когда она была создана), ее нужно запустить, активизировать. Для этого в Sedna используется команда se_sm, в качестве аргумента которой также передается название базы данных. Структура и содержимое базы данных формируются несколько отличным от традиционного способа образом. Первым шагом создания базы данных является создание XML-файла (вручную в текстовом редакторе или полуавтоматизированно, в специальных XML-редакторах). Далее полученный XML-документ загружается в базу, при этом в составе одной и той же базы данных могут быть выделены несколько независимых документов, к каждому из которых могут быть обращены свои специфические запросы. Для загрузки документа в базу данных используется функция se_term, которой в качестве аргумента передается имя XQuery-файла, в котором прописываются имя базы данных и расположение файла, подгружаемого в нее. Sedna Admin – это инструментально-программное средство, в визуальном режиме поддерживающее работу с XML-СУБД Sedna. Для развертывания Sedna Admin достаточно загрузить дистрибутив (в виде архива, как и сама СУБД) и скопировать его на локальную машину. Для начала работы нужно выбрать активную базу данных, фактически, установить связь с ней. Изначально это средство позиционируется как инструментарий отладки и выполнения запросов XQuery (запуск запросов из командной строки или из специальных файлов довольно трудоемок и проблематичен). Sedna Admin позволяет в режиме реального времени написать программный код запроса XQuery и запустить его на выполнение. При наличии ошибок инструментальное средство дает их подробное описание и рекомендации к исправлению. XQuery. Запросы к БД выполняются посредством формулирования запросов на специальном языке XML Query (XQuery). Этот язык стандартизирован консорциумом W3C. Язык является функциональным, строго типизированным, модульным, весьма выразительным и изящным. В его разработке принимали участие ведущие специалисты отрасли СУБД. Язык XQuery позволяет извлекать древовидные данные, трансформировать их и генерировать в качестве результата опять же древовидные данные (XML). Язык XQuery определяет синтаксис итераций инструкции FLWOR. Слово FLWOR — это сокращение от слов for, let, where, order by и return. Инструкция FLWOR состоит из следующих частей. Одно или несколько предложений FOR, которые привязывают одну или несколько переменных-итераторов к входным последовательностям. Входные последовательности также могут быть выражениями XQuery (например, выражениями XPath). Они являются либо последовательностями узлов, либо последовательностями атомарных значений. Последовательности атомарных значений могут быть получены с помощью литералов или функций-конструкторов. В SQL Server нельзя использовать построенные XML-узлы в качестве входных последовательностей. Необязательное предложение let. Это предложение присваивает значение данной переменной для конкретной итерации. Присвоенное выражение может быть выражением XQuery, например выражением XPath, и может возвращать либо последовательность узлов, либо последовательность атомарных значений. Последовательности атомарных значений 3 могут быть получены с помощью литералов или функций-конструкторов. В SQL Server нельзя использовать построенные XML-узлы в качестве входных последовательностей. Переменная-итератор. Дополнительно для этой переменной с помощью ключевого слова as можно указать тип. Необязательное предложение where. Это предложение применяется в качестве предиката фильтра при итерации. Необязательное предложение order by. Выражение return. Выражение в предложении return конструирует результат, возвращаемый инструкцией FLWOR. XSLT – это расширяемый язык стилей для преобразований (от англ. eXtensible Stylesheet Language for Transformations), который используется для описания преобразований структуры документов. XSLT позволяет трансформировать одни документы в другие, пользуясь простыми наборами правил преобразования. Технология XSLT – это технология, позволяющая преобразовывать (трансформировать) XML-документ в другой XML-документ; в HTML-документ для отображения Webбраузером; в документы иных форматов (WML, RTF, PDF, TEX и т.п.). Таблица стилей – это XML-документ специального вида (обычно файл с расширением .xsl), содержащий набор правил преобразования исходного XML-документа, написанных на языке XSLT и предназначенных для XSLT-процессора. Когда XSLT-процессор подвергает преобразованию некоторый XML-документ в соответствии с некоторой таблицей стилей, говорят, что таблица стилей применяется к документу. В первом приближении можно считать, что исходный документ, таблица стилей и конечный документ – все являются XML-документами. XSLT выполняет процесс преобразования, потому что вывод (конечный документ) и ввод (исходный документ) представляют собой объекты одного типа. Это дает прямые выгоды, например, сложное преобразование можно выполнить как ряд простых преобразований, кроме того, используя одну и ту же технологию, можно делать преобразования в любом направлении. Таблица стилей – это корректный XML-документ. Его корневым элементом является элемент «stylesheet», естественно, принадлежащий пространству имен XSLT. В корневом элементе объявляется пространство имен XSLT с помощью атрибута «xmlns:xsl», а также версия XSLT с помощью атрибута «version». Из так называемых элементов верхнего уровня, являющихся непосредственными потомками корневого элемента «stylesheet», обязателен хотя бы один элемент – шаблон. Роль шаблонов в преобразовании является ключевой. Таблица стилей должна содержать, по крайней мере, один шаблон; на самом деле их зачастую бывает много. В свою очередь, тело шаблона может содержать: – поддеревья конечных литеральных элементов, которые непосредственно копируются в выходное дерево; – элементы-инструкции, выполнение которых процессором приводит к формированию отдельных узлов или целых поддеревьев на основе узлов исходного дерева, которые также помещаются в выходное дерево. 4. Порядок выполнения работы А. Создание и заполнение XML-документа 1. Запустить Microsoft Visual Web Developer: Пуск | Программы | Microsoft Visual Web Developer 2008 Express Edition ► Start Page – Visual Web Developer 2008 Express Edition 2. Создать новый XML-документ: File | New File… | Xml File ► ф. XmlFile1.xml 3. Создать корневой элемент Education: 4 – ввести открывающий тег: <Education> – ввести закрывающий тег: </Education> 4. Создать XML-иерархию данных о студентах: – ввести открывающий тег элемента Students: <Students> – ввести открывающий тег первого элемента Student: <Student> – до закрывающей угловой скобки в теге Student ввести атрибут stud_ID со значением s1: stud_ID="s1" аналогичным образом создать ● атрибут no_zk со значением "111111"; ● атрибут fam со значением "Иванов"; ● атрибут im со значением "Иван"; ● атрибут ot со значением "Иванович"; – ввести одиночный тег элемента Group с атрибутом grID="g1": <Group grID="g1"/> – ввести закрывающий тег первого элемента Student: </Student> аналогичным образом создать еще четыре элемента Student. – ввести закрывающий тег элемента Students: </Students> – ввести открывающий тег элемента Groups: <Groups> – ввести открывающий тег первого элемента Group: <Group> – до закрывающей угловой скобки в теге Group ввести атрибут grID со значением g1: grID="g1" аналогичным образом создать атрибут kurs со значением "1" , атрибут gr со значением "10" и атрибут specID со значением "sp1"; – ввести закрывающий тег первого элемента Group: </Group> аналогичным образом создать еще три элемента Group. – ввести закрывающий тег элемента Groups: </Groups> 5 – ввести открывающий тег элемента Specialities: <Specialities> – ввести открывающий тег первого элемента Spec: <Spec> – до закрывающей угловой скобки в теге Spec ввести атрибут specID со значением sp1. аналогичным образом создать атрибут spec_name со значением "АСОИ": – ввести закрывающий тег первого элемента Spec: </Spec> аналогичным образом создать еще три элемента Spec. – ввести закрывающий тег элемента Specialities: </Specialities> – ввести открывающий тег элемента Subjects: <Subjects> – ввести открывающий тег первого элемента Subject: <Subject> – до закрывающей угловой скобки в теге Subject ввести атрибут predmID со значением p1; аналогичным образом создать ● атрибут spec_name со значением "АСОИ"; ● атрибут predm_name со значением "БД"; ● атрибут cycle со значением "ОПД"; ● атрибут hours со значением "80"; – ввести закрывающий тег первого элемента Subject: </Subject> аналогичным образом создать еще три элемента Subject. – ввести закрывающий тег элемента Subjects: </Subjects> – ввести открывающий тег элемента Results: <Results> – ввести открывающий тег первого элемента Uspev: <Uspev> – до закрывающей угловой скобки в теге Uspev ввести атрибут stud со значением s1: аналогичным образом создать атрибут predm со значением "p1" и атрибут ocenka со значением "5" – ввести закрывающий тег первого элемента Uspev: </ Uspev> Аналогичным образом создать еще десять элементов Uspev. – ввести закрывающий тег элемента Results: 6 </Results> 5. Сохранить XML-документ как Edu.xml. Б. Создание XML-базы данных в Sedna 1. Запустить СУБД Sedna – открыть командную строку Windows: Пуск | Выполнить → ф. Запуск программы; Открыть ← cmd – изменить текущую директорию на D:\sedna\bin ф. C:\Windows\system32\cmd.exe (далее – просто cmd); ввести CD D:\sedna\bin; нажать кл. [Enter]; ввести D:; нажать кл. [Enter] → D:\sedna\bin> – запустить СУБД: ф. cmd; ввести код: se_gov; нажать кл. [Enter] → GOVERNOR has been started in the background mode 2. Создать новую базу данных Education: ф. cmd; ввести код: se_cdb Education нажать кл. [Enter] → The database 'Education' has been created successfully 3. Запустить базу данных Education: ф. cmd; ввести код: se_sm Education нажать кл. [Enter] → SM has been created successfully 4. Создать файл load_data.xquery: Проводник Windows | директория Sedna/BIN; создать текстовый документ ввести код: LOAD "Edu.xml" "education" сохранить документ как load_data.xquery; скопировать в эту же директорию файл Edu.xml. 5. Загрузить XML-файл в базу данных ф. cmd; ввести код: se_term –file load_data.xquery Education; нажать кл. [Enter] → Bulk load succeed В. Программирование запросов XQuery в Sedna 1. Запустить инструментальное средство SednaAdmin: Проводник | Локальный диск D | директория sednaadmin-bin-0.1.5 | директория sednaadmin-bin; запустить файл SednaAdmin.jar → ф. SednaAdmin 2. Соединиться с базой данных Education ф. SednaAdmin | localhost | education; панель управления | кн. Connect to running database; ф. Connect to database | Host ← localhost; Database Name ← education; кн. OK 3. Написать запрос XQuery для извлечения списка всех студентов: ф. SednaAdmin | localhost | education; ф. Query1 (education); ввести код: for $x in doc("Edu.xml")/Education/Students/Student order by $x/@fam return concat($x/@fam,' ', $x/@im,' ', $x/@ot) 7 кн. Execute → ф. Results | XML → результат на экране аналогичным образом написать запрос на извлечение списков всего специальностей, групп, предметов. 4. Написать запрос XQuery для извлечения списка всех студентов с указанием названий их специальностей: ф. SednaAdmin | localhost | education; ф. Query1 (education); ввести код: for $x in doc("Edu.xml")/Education/Students/Student let $gr:=$x/Group/@grID let $specID:=for $y in doc("Edu.xml")/Education/Groups/Group[@grID=$gr] return $y/@specID let $spec_name:=for $z in doc("Edu.xml")/Education/Specialities/Spec[@specID=$specID] return $z/@spec_name return concat($x/@fam,' ', $x/@im,' ', $x/@ot, ' ', $spec_name) кн. Execute → ф. Results | XML → результат на экране 5. Написать запрос XQuery для извлечения списка всех студентов с указанием их групп в формате ФИО (Фамилия, имя, отчество) + Группа (Название специальности – Курс Группа): ф. SednaAdmin | localhost | education; ф. Query1 (education); ввести код: for $x in doc("Edu.xml")/Education/Students/Student let $gr:=$x/Group/@grID let $specID:=for $y in doc("Edu.xml")/Education/Groups/Group[@grID=$gr] return $y/@specID let $kurs:=for $y in doc("Edu.xml")/Education/Groups/Group[@grID=$gr] return $y/@kurs let $gr:=for $y in doc("Edu.xml")/Education/Groups/Group[@grID=$gr] return $y/@gr let $spec_name:=for $z in doc("Edu.xml")/Education/Specialities/Spec[@specID=$specID] return $z/@spec_name where $spec_name='АСОИ' return concat('ФИО: ', $x/@fam,' ', $x/@im,' ', $x/@ot, ' Группа: ', $spec_name,'-',$kurs,$gr) кн. Execute → ф. Results | XML → результат на экране 5. Написать запрос XQuery для извлечения списка всех студентов определенной специальности: ф. SednaAdmin | localhost | education; ф. Query1 (education); ввести код: for $x in doc("Edu.xml")/Education/Students/Student let $gr:=$x/Group/@grID let $specID:=for $y in doc("Edu.xml")/Education/Groups/Group[@grID=$gr] return $y/@specID let $spec_name:=for $z in doc("Edu.xml")/Education/Specialities/Spec[@specID=$specID] return $z/@spec_name where $spec_name='название специальности' return concat($x/@fam,' ', $x/@im,' ', $x/@ot, ' ', $spec_name) кн. Execute → ф. Results | XML → результат на экране аналогичным образом написать запрос для извлечения списка дисциплин заданной кафедры. 8 6. Написать запрос XQuery для извлечения количества студентов определенной специальности: ф. SednaAdmin | localhost | education; ф. Query1 (education); ввести код: count(for $x in doc("Edu.xml")/Education/Students/Student let $gr:=$x/Group/@grID let $specID:=for $y in doc("Edu.xml")/Education/Groups/Group[@grID=$gr] return $y/@specID let $spec_name:=for $z in doc("Edu.xml")/Education/Specialities/Spec[@specID=$specID] return $z/@spec_name where $spec_name='название специальности' return concat($x/@fam,' ', $x/@im,' ', $x/@ot, ' ', $spec_name)) кн. Execute → ф. Results | XML → результат на экране 7. Написать запрос XQuery для извлечения списка всех студентов первого курса: ф. SednaAdmin | localhost | education; ф. Query1 (education); ввести код: ф. SednaAdmin | localhost | education; ф. Query1 (education); ввести код: for $x in doc("Edu.xml")/Education/Students/Student let $gr:=$x/Group/@grID let $specID:=for $y in doc("Edu.xml")/Education/Groups/Group[@grID=$gr] return $y/@specID let $kurs:=for $y in doc("Edu.xml")/Education/Groups/Group[@grID=$gr] return $y/@kurs where $kurs='1' кн. Execute → ф. Results | XML → результат на экране 8. Написать запрос XQuery для извлечения количества студентов первого курса: ф. SednaAdmin | localhost | education; ф. Query1 (education); ввести код: count(for $x in doc("Edu.xml")/Education/Students/Student let $gr:=$x/Group/@grID let $specID:=for $y in doc("Edu.xml")/Education/Groups/Group[@grID=$gr] return $y/@specID let $kurs:=for $y in doc("Edu.xml")/Education/Groups/Group[@grID=$gr] return $y/@kurs where $kurs='1') кн. Execute → ф. Results | XML → результат на экране 9. Написать запрос XQuery для извлечения списка всех студентов, которые учатся только на 4 и 5: ф. SednaAdmin | localhost | education; ф. Query1 (education); ввести код: for $x in doc("Edu.xml")/Education/Students/Student let $st:=$x/@stud_ID let $otl:=count(for $z in doc("Edu.xml")/Education/Results/USpev[@stud=$st][@ocenka='5'] return $z/@stud) let $hor:=count(for $z in doc("Edu.xml")/Education/Results/USpev[@stud=$st][@ocenka='4'] return $z/@stud) let $ud:=count(for $z in doc("Edu.xml")/Education/Results/USpev[@stud=$st][@ocenka='3'] return $z/@stud) 9 let $neud:=count(for $z in doc("Edu.xml")/Education/Results/USpev[@stud=$st][@ocenka='2'] return $z/@stud) where ($otl > 0 or $hor > 0) and ($ud=0 and $neud=0) return concat($x/@fam,' ', $x/@im,' ', $x/@ot, $otl) кн. Execute → ф. Results | XML → результат на экране 10. Написать запрос XQuery для извлечения количества студентов, которые учатся только на 4 и 5: ф. SednaAdmin | localhost | education; ф. Query1 (education); ввести код: count(for $x in doc("Edu.xml")/Education/Students/Student let $st:=$x/@stud_ID let $otl:=count(for $z in doc("Edu.xml")/Education/Results/USpev[@stud=$st][@ocenka='5'] return $z/@stud) let $hor:=count(for $z in doc("Edu.xml")/Education/Results/USpev[@stud=$st][@ocenka='4'] return $z/@stud) let $ud:=count(for $z in doc("Edu.xml")/Education/Results/USpev[@stud=$st][@ocenka='3'] return $z/@stud) let $neud:=count(for $z in doc("Edu.xml")/Education/Results/USpev[@stud=$st][@ocenka='2'] return $z/@stud) where ($otl > 0 or $hor > 0) and ($ud=0 and $neud=0) return concat($x/@fam,' ', $x/@im,' ', $x/@ot, $otl)) кн. Execute → ф. Results | XML → результат на экране 11. Написать запрос XQuery для извлечения списка студентов, изучавших заданную дисциплину: ф. SednaAdmin | localhost | education; ф. Query1 (education); ввести код: for $x in doc("Edu.xml")/Education/Students/Student let $st:=$x/@stud_ID let $predm:=for $y in doc("Edu.xml")/Education/Subjects/Subject[@predm_name='дисциплина'] return $y/@predmID let $count:=count(for $z in doc("Edu.xml")/Education/Results/USpev[@stud=$st][@predm=$predm] return $z) where $count > 0 return concat($x/@fam,' ', $x/@im,' ', $x/@ot) кн. Execute → ф. Results | XML → результат на экране аналогичным образом написать запрос для извлечения списка студентов, не изучавших заданную дисциплину. Г. Программирование таблиц стилей XSL 1. Создать текстовый документ и внести в него код: <?xml version="1.0" encoding="windows-1251"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <HTML><HEAD><TITLE>Лабораторная работа 7</TITLE></HEAD> 10 <BODY><H2>Информация о студентах</H2> <TABLE border="1" width="60%"> <TR> <TH width="10%">Код</TH> <TH width="20%">Зачетная книжка</TH> <TH width="40%">ФИО</TH> <TH width="30%">Группа</TH> </TR> <xsl:for-each select="//Student"> <xsl:variable name="x" select="Group/@grID"/> <xsl:variable name="gr" select="../../Groups/Group[@grID=$x]/@gr"/> <TR align="center"><TD width="10%"> <xsl:value-of select="@stud_ID"/> </TD> <TD width="20%"> <xsl:value-of select="@no_zk"/> </TD><TD width="40%"> <xsl:value-of select="concat(@fam,' ',@im,'.'m@ot,'.')"/> </TD> <TD width="30%"><xsl:value-of select="$gr"/></TD> </TR> </xsl:for-each> </TABLE></BODY></HTML> </xsl:template></xsl:stylesheet> 2. Сохранить документ как stylesheet.xsl. 3. Подключить таблицу стилей к документу XML. Открыть документ в текстовом редакторе; после строки <?xml version="1.0" encoding="windows-1251"?> ввести код <?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?> 4. Проверить работоспособность таблицы стилей открытием XML-файла в браузере. 5. Контрольные вопросы 1. К какому классу СУБД относится Sedna? 2. Каковы особенности Sedna? 3. Что такое XQuery? 4. Что такое XSLT? 5. Для чего используется Sedna Admin? 6. Содержание и оформление отчета Отчет должен содержать: – титульный лист, название и цель работы; – скриншоты результатов работы с СУБД Sedna; – выводы по работе. 11