
- •Предназначение xml
- •Язык xml решает проблемы
- •Создание xml-документов
- •Отображение xml-документов
- •Некоторые базовые правила xml
- •Отображение xml-документа
- •Отобразите xml-документ без таблицы стиля
- •Основной критерий для валидного документа
- •Форма записи dtd
- •Создание dtd
- •Объявление типов элементов
- •Форма записи объявления типа элемента
- •Описание содержимого элемента
- •Задание дочернего содержимого элемента
- •Форма записи объявления списка атрибутов
- •Тип атрибута
- •Задание маркерного типа
- •Лабораторная работа 2 Пространства имен xml
- •Теоретическая часть Анатомия элемента
- •Вставка элементов html в xml-документы и использование пространства имен
- •Подготовка:
- •Ситуация:
- •Задание:
- •Примечание:
- •Решение:
- •Теория Вставка элементов html в xml-документы и использование пространства имен
- •Использование одного шаблона xsl
- •Предназначение xml
- •Язык xml решает проблемы
- •Создание xml-документов
- •Отображение xml-документов
- •Некоторые базовые правила xml
- •Отображение xml-документа
- •Отобразите xml-документ без таблицы стиля
- •Основной критерий для валидного документа
- •Форма записи dtd
- •Создание dtd
- •Объявление типов элементов
- •Форма записи объявления типа элемента
- •Описание содержимого элемента
- •Задание дочернего содержимого элемента
- •Форма записи объявления списка атрибутов
- •Тип атрибута
- •Задание маркерного типа
- •Лабораторная работа 2 Пространства имен xml
- •Теоретическая часть Анатомия элемента
- •Вставка элементов html в xml-документы и использование пространства имен
- •Подготовка:
- •Ситуация:
- •Задание:
- •Примечание:
- •Решение:
- •Теория Вставка элементов html в xml-документы и использование пространства имен
- •Использование одного шаблона xsl
- •Предназначение xml
- •Язык xml решает проблемы
- •Создание xml-документов
- •Отображение xml-документов
- •Некоторые базовые правила xml
- •Отображение xml-документа
- •Отобразите xml-документ без таблицы стиля
- •Основной критерий для валидного документа
- •Форма записи dtd
- •Создание dtd
- •Объявление типов элементов
- •Форма записи объявления типа элемента
- •Описание содержимого элемента
- •Задание дочернего содержимого элемента
- •Форма записи объявления списка атрибутов
- •Тип атрибута
- •Задание маркерного типа
- •Лабораторная работа 2 Пространства имен xml
- •Теоретическая часть Анатомия элемента
- •Вставка элементов html в xml-документы и использование пространства имен
- •Подготовка:
- •Ситуация:
- •Задание:
- •Примечание:
- •Решение:
- •Теория Вставка элементов html в xml-документы и использование пространства имен
- •Использование одного шаблона xsl
- •Лабораторная работа 5 Вывод документа xml в Internet Explorer с использованием dom xml
- •3.2. Реализация dom xml в Internet Explorer
- •3.3. Фундаментальные типы узлов dom для xml
- •3.3.1. Узлы NodeList и NamedNodeMap
- •3.3.2. Узел Node
- •3.3.3. Узел Document
- •3.3.4. Узел DocumentFragment
- •3.3.5. Узел Element
- •3.3.6. Узел Attr
- •3.3.7. Узел Comment
- •3.3.8. Узел Text
- •4. Порядок выполнения работы
- •Вариант 2-01
- •Вариант 2-02
- •Вариант 2-03
- •Вариант 2-04
- •Вариант 2-05
- •Вариант 2-06
- •Вариант 2-07
- •Вариант 2-08
- •Вариант 2-09
- •Вариант 2-10
- •Вариант 2-11
- •Вариант 2-12
- •Вариант 2-13
- •Вариант 2-14
- •Вариант 2-15
- •Вариант 2-16
- •Вариант 2-17
- •Вариант 2-18
- •Вариант 2-19
- •Вариант 2-20
- •Вариант 2-21
- •Вариант 2-22
- •Вариант 2-23
- •Вариант 2-24
- •Вариант 2-25
- •Вариант 2-26
- •Вариант 2-27
- •Вариант 2-28
- •Вариант 2-29
- •Вариант 2-30
- •5. Содержание отчета
- •6. Вопросы для самоконтроля
Использование одного шаблона xsl
В отличие от CSS, содержащей правила, XSL-таблица стилей включает один или несколько шаблонов, каждый из которых содержит информацию для отображения в определенной ветви элементов в XML-документе. В этом разделе вы узнаете, как создать простую XSL-таблицу стилей, которая включает только один шаблон. Этот шаблон содержит информацию для отображения всего документа.
В Листинге 3 представлен первый пример XSL-таблицы стилей. Эта таблица стилей связана с XML-документом, представленным в Листинге 3.
<?xml version="1.0"?>
<!-- File name: XslDemo01.xsl -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<H2>Book Description</H2>
<SPAN STYLE="font-style:italic">Author: </SPAN>
<xsl:value-of select="BOOK/AUTHOR"/><BR/>
<SPAN STYLE="font-style:italic">Title: </SPAN>
<xsl:value-of select="BOOK/TITLE"/><BR/>
<SPAN STYLE="font-style:italic">Price: </SPAN>
<xsl:value-of select="BOOK/PRICE"/><BR/>
<SPAN STYLE="font-style:italic">Binding type: </SPAN>
<xsl:value-of select="BOOK/BINDING"/><BR/>
<SPAN STYLE="font-style:italic">Number of pages: </SPAN>
<xsl:value-of select="BOOK/PAGES"/>
</xsl:template>
</xsl:stylesheet>
Листинг 3. XslDemo01.xsl (html, txt)
<?xml version="1.0"?>
<!-- File name: XslDemo01.xml -->
<?xml-stylesheet type="text/xsl" href="XslDemo01.xsl"?>
<BOOK>
<TITLE>Moby-Dick</TITLE>
<AUTHOR>
<FIRSTNAME>Herman</FIRSTNAME>
<LASTNAME>Melville</LASTNAME>
</AUTHOR>
<BINDING>hardcover</BINDING>
<PAGES>724</PAGES>
<PRICE>$9.95</PRICE>
</BOOK>
Листинг 4. XslDemo01.xml (html, txt)
На рисунке 10.1 показано как Internet Explorer 5 отображает XML-документ в соответствии с инструкциями из таблицы стилей.
Рис. 3.
Каждая XSL-таблица стилей должна иметь элемент Документ, представленный ниже. (Напомним, что элемент Документ, известный как корневой элемент, является XML-элементом верхнего уровня, который содержит все остальные элементы.)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- один или несколько элементов шаблона …-->
</xsl:stylesheet>
Элемент Документ xsl:stylesheet служит не только хранилищем других элементов, но также идентифицирует документ как XSL-таблицу стилей. Этот элемент является одним из XSL-элементов специального назначения, используемых в таблице стилей. Все XSL-элементы принадлежат пространству имен xsl – т. е. вы предваряете имя каждого XSL-элемента префиксом xsl:, обозначающим пространство имен. Вы определяете это пространство имен в начальном теге элемента xsl:stylesheet, например, следующим образом:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
Это определение позволяет вам использовать пространство имен внутри элементов таблицы стилей.
Элемент Документ xsl:stylesheet XSL-таблицы стилей должен содержать один или несколько шаблонов элементов, которые для краткости будем называть шаблонами. Элемент Документ из Листинга 3 содержит только один шаблон, который имеет следующую форму:
<xsl:template match="/">
<!-- дочерние элементы … -->
</xsl:template>
Браузер использует шаблон для отображения определенной ветви элементов в иерархии XML-документа, с которым вы связываете таблицу стилей. Атрибут match шаблона указывает на определенную ветвь. (Атрибут match аналогичен селектору в правиле CSS). Значение атрибута match носит название образца (pattern). Образец в данном примере ("/") представляет корневой элемент всего XML-документа. Этот шаблон, таким образом, содержит инструкции для отображения всего XML-документа.
Каждая XSL-таблица стилей должна содержать один и только один шаблон с атрибутом match, который имеет значение "/". Вы также можете включить один или несколько дополнительных шаблонов с инструкциями для отображения определенных подчиненных ветвей в структуре XML-документа; каждая из них должна иметь образец, отвечающий определенной ветви.
Корневой образец ("/") не представляет элемент Документ (или корневой элемент) XML-документа. Он представляет весь документ, для которого элемент Документ является дочерним.
Вот полное описание шаблона из рассматриваемой таблицы стилей:
<xsl:template match="/">
<H2>Book Description</H2>
<SPAN STYLE="font-style:italic">Author: </SPAN>
<xsl:value-of select="BOOK/AUTHOR"/><BR/>
<SPAN STYLE="font-style:italic">Title: </SPAN>
<xsl:value-of select="BOOK/TITLE"/><BR/>
<SPAN STYLE="font-style:italic">Price: </SPAN>
<xsl:value-of select="BOOK/PRICE"/><BR/>
<SPAN STYLE="font-style:italic">Binding type: </SPAN>
<xsl:value-of select="BOOK/BINDING"/><BR/>
<SPAN STYLE="font-style:italic">Number of pages: </SPAN>
<xsl:value-of select="BOOK/PAGES"/>
</xsl:template>
Шаблон содержит два вида XML-элементов.
XML-элементы, представляющие HTML-разметку. Примерами подобного вида XML-элемента из рассматриваемой таблицы стилей являются:
<H2>Book Description</H2>
который отображает заголовок второго уровня,
<SPAN STYLE="font-style:italic">Author: </SPAN>
который отображает блок текста, набранного курсивом (Author:), и
<BR/>
который создает пустую строку.
Все эти XML-элементы являются корректно сформированными и представляют стандартные HTML-элементы. Браузер просто копирует каждый HTML-элемент непосредственно на выход HTML, который воспринимает и отображает их.
Подсказка. Каждый из элементов, представляющих HTML-разметку, должен быть корректно сформированным XML-элементом, а также стандартным HTML-элементом. (Не забывайте, что XSL-таблица стилей является XML-документом.) Следовательно, вы не можете использовать HTML-конструкции, которые не являются корректно сформированным XML, такие, как элементы, состоящие только из начального тега. Например, чтобы задать элемент перевода строки в HTML, вы не можете просто ввести <BR>, как вы это делаете для HTML-страницы. Вместо этого вы должны использовать корректно сформированный тег пустого XML-элемента, <BR/>.
XSL-элементы. Примерами XSL-элементов из рассматриваемой таблицы стилей являются элементы xsl:value-of, например:
<xsl:value-of select="BOOK/AUTHOR"/>
Браузер отличает XSL-элемент от элемента, представляющего HTML, поскольку первый имеет в качестве префикса описание пространства имен xsl:. XSL-элементы в шаблоне не копируются на выход HTML. Они лишь содержат инструкции по выбору и модификации данных XML, либо используются для выполнения других задач.
XSL-элемент value-of добавляет текстовое содержимое определенного XML-элемента – а также любых его дочерних элементов, которые он имеет – в выходной модуль HTML, который воспринимается и отображается браузером. Вы указываете определенный XML-элемент заданием образца, который присваиваете атрибуту select XSL-элемента value-of. В рассмотренном выше примере элемента value-of атрибуту select присвоен образец "BOOK/AUTHOR", что приводит к выводу текстового содержимого элемента AUTHOR XML-документа. Текстовое содержимое элемента AUTHOR состоит из символьных данных, принадлежащих двум его дочерним элементам, FIRSTNAME и LASTNAME.
Обратите внимание, что XML-элемент в образце задается с помощью оператора пути (в данном случае BOOK/AUTHOR ), который определяет местонахождение элемента в иерархии XML-документа. (Оператор пути аналогичен пути к файлу, который операционная система использует для указания местонахождения файла или папки.)
Главный момент, на который здесь следует обратить внимание, состоит в том, что оператор пути в значении атрибута select относится к текущему элементу. Каждый контекст внутри XSL-таблицы стилей относится к текущему элементу. Поскольку рассматриваемый пример шаблона относится к корневому элементу всего документа (посредством установки атрибута match="/" ), текущим "элементом" для данного шаблона является корневой элемент документа. (В данном случае текущий элемент не обладает соответствующим литералом, а является родителем элемента Документ.) Таким образом, внутри этого шаблона оператор пути BOOK/AUTHOR указывает на элемент AUTHOR, вложенный в элемент BOOK, вложенный в корневой элемент документа. (Оператор пути в значении атрибута select аналогичен неполному пути к файлу, задающему местонахождение файла относительно текущей рабочей папки.)
Если вы опустите атрибут select для XSL-элемента value-of, элемент будет осуществлять вывод текстового содержимого плюс текстовое содержимое всех дочерних элементов текущего элемента. (В нашем примере, поскольку текущим является корневой элемент, пропуск атрибута select приведёт к выводу всех символьных данных XML-документа.)
Целью представленного в рассматриваемом примере шаблона элементов является отображение текста названия для каждого из дочерних XML-элементов в документе ( AUTHOR, TITLE, PRICE, BINDING и PAGES ) плюс текстового содержимого каждого элемента. Обратите внимание, что порядок элементов value-of в шаблоне определяет порядок, в котором браузер отображает эти элементы. Таким образом, даже из этой простой таблицы стилей вы можете понять, что XSL-таблица стилей является гораздо более гибкой, чем CSS, которая всегда отображает элементы в том порядке, в котором они следуют в документе.
Итак, как вы могли заметить, XSL-таблица стилей сообщает браузеру, как отобразить XML-документ путем избирательного преобразования XML-элементов в блок HTML-разметки, который воспринимается и отображается браузером аналогично разметке, содержащейся на HTML-странице. Заметим, однако, что вам не нужно включать в XSL-шаблон элементы, представляющие элементы HTML или BODY, которые являются стандартными составными частями HTML-страницы, поскольку браузер сам эффективно их формирует.
На рисунке 4 показано как браузер генерирует первую часть блока HTML-разметки для документа и таблицы стилей из Листингов 3 и 4
Рис. 4.
XML-документ
<AUTHOR>
<FIRSTNAME>Herman</FIRSTNAME
<LASTNAME>Melville</LASTNAME>
</AUTHOR>
XSL-таблица стилей
<H2>Book Description</H2>
<SPAN STYLE="font-style:italic">Author: </SPAN>
<xsl:value-of select="BOOK/AUTHOR"/><BR/>
Отображаемый HTML
<H2>Book Description</H2>
<SPAN STYLE="font-style:italic">Author: </SPAN>
Hermann Melville
Ссылка. Для получения более подробной информации о работе с HTML и динамическим HTML (DHTML) в Internet Explorer, обратитесь к следующему Web-сайту, предоставленному MSDN: http://msdn.microsoft.com/workshop/author/default.asp. Если вы хотите познакомиться с официальной спецификацией HTML, обратитесь к следующему Web-сайту, предоставленномуW3C: http://www.w3.org/TR/REC-html40/.
Подготовка:
Создайте на диске каталог Lab3 и скопируйте в него созданные вами на лабораторной работе 2 файлы pbml.dtd и Phonebook.xml.
Ситуация:
При применении созданных вами XML-совместимых документов для хранения информации телефонной книги возникли проблемы. Эти проблемы связаны с тем, что имена некоторых элементов и атрибутов (например, Record и Number) конфликтуют с именами элементов и атрибутов в других XML-совместимых документах.
Задание:
Устраните возможность возникновения конфликтов путем включения информации о префиксе пространства имен в документы pbml.dtd и Phonebook.xml в каталоге Lab3. При этом:
используйте префикс пространства имен "pbml"
в качестве URI для пространства имен используйте значение "http://www.askit.ru/pbml"
данный префикс должен быть использован для всех элементов и атрибутов ваших документов.
Проверьте правильность измененных вами документов pbml.dtd и Phonebook.xml средствами Open XML Editor и сохраните их.
Примечание:
Для экономии времени можно воспользоваться средствами автоматического поиска и замены (например, Replace в Notepad).
Решение:
Итоговый код файла pbml.dtd может быть таким:
<?xml version="1.0" encoding="WINDOWS-1251"?>
<!ELEMENT pbml:Phonebook (pbml:Record+)>
<!ATTLIST pbml:Phonebook xmlns:pbml CDATA #FIXED "http://www.askit.ru/pbml" >
<!ELEMENT pbml:Record (pbml:LastName, pbml:FirstName, pbml:Initials?, pbml:Phonenumber*)>
<!ATTLIST pbml:Record
pbml:Number CDATA #REQUIRED>
<!ELEMENT pbml:LastName (#PCDATA)>
<!ELEMENT pbml:FirstName (#PCDATA)>
<!ELEMENT pbml:Initials (#PCDATA)>
<!ELEMENT pbml:Phonenumber (#PCDATA) >
<!ATTLIST pbml:Phonenumber
pbml:PhoneType (L|M) #REQUIRED>
Итоговый код файла PhoneBook.xml может быть таким:
<?xml version="1.0" encoding="WINDOWS-1251"?>
<!DOCTYPE pbml:Phonebook SYSTEM "pbml.dtd">
<pbml:Phonebook xmlns:pbml="http://www.askit.ru/pbml">
<pbml:Record pbml:Number="1">
<pbml:LastName>Иванов</pbml:LastName>
<pbml:FirstName>Иван</pbml:FirstName>
<pbml:Initials>Иванович</pbml:Initials>
<pbml:Phonenumber pbml:PhoneType="L">1111111</pbml:Phonenumber>
<pbml:Phonenumber pbml:PhoneType="M">8-911-1111111</pbml:Phonenumber>
</pbml:Record>
<pbml:Record pbml:Number="2">
<pbml:LastName>Петров</pbml:LastName>
<pbml:FirstName>Петр</pbml:FirstName>
<pbml:Initials>Петрович</pbml:Initials>
<pbml:Phonenumber pbml:PhoneType="L">2222222</pbml:Phonenumber>
<pbml:Phonenumber pbml:PhoneType="M">8-911-2222222</pbml:Phonenumber>
</pbml:Record>
<pbml:Record pbml:Number="3">
<pbml:LastName>Сидорова</pbml:LastName>
<pbml:FirstName>Светлана</pbml:FirstName>
<pbml:Initials>Степановна</pbml:Initials>
<pbml:Phonenumber pbml:PhoneType="L">3333333</pbml:Phonenumber>
<pbml:Phonenumber pbml:PhoneType="M">8-911-3333333</pbml:Phonenumber>
</pbml:Record>
</pbml:Phonebook>
Проверка измененных вами файлов проводится точно так же, как в предыдущей лабораторной работе (см. ответ к лабораторной работе 2).
Лабораторная работа 4 Работа с XML Schema
Создание XML Schema, тег xs:schema, утилита Stylus Studio, XML Writer
Подготовка:
Создайте на диске каталог Lab4 и скопируйте в него измененные вами на лабораторной работе 3 файлы pbml.dtd и Phonebook.xml.
Ситуация:
Для целей совместимости с корпоративными приложениями вам предписано перейти на использование XML Schema вместо DTD.
Задание:
1) Создайте XML Schema для вашего документа Phonebook.xml и сохраните ее в файле pbml.xsd. Перенастройте ваш документ на использование данной XML Schema.
2) проверьте созданную вами XML Schema средствами Stylus Studio на соответствие документу Phonebook.xml.
3) Сделайте копию файла Phonebook.xml и переименуйте ее в StylusPhonebook.xml. Затем средствами Stylus Studio сгенерируйте файл XML Schema для документа Phonebook.xml (он должен называться StylusPbml.xsd).
4) Средствами XML Writer создайте на основе имеющегося у вас файла pbml.dtd файл XML Schema (он должен называться WriterPbml.xsd).
5) Cравните созданные разными способами файлы схемы pbml.xsd, StylusPbml.xsd и WriterPbml.xsd.
Решение:
К пункту 1:
Созданный вручную файл XML Schema (pbml.xsd) может выглядеть, например, так:
<?xml version="1.0" encoding="WINDOWS-1251"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.askit.ru/pbml" xmlns:pbml="http://www.askit.ru/pbml">
<xs:element name="Phonebook">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="pbml:Record"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Record">
<xs:complexType>
<xs:sequence>
<xs:element ref="pbml:LastName"/>
<xs:element ref="pbml:FirstName"/>
<xs:element ref="pbml:Initials"/>
<xs:element maxOccurs="unbounded" ref="pbml:Phonenumber"/>
</xs:sequence>
<xs:attribute name="Number" use="required" form="qualified" type="xs:integer"/>
</xs:complexType>
</xs:element>
<xs:element name="LastName" type="xs:Name"/>
<xs:element name="FirstName" type="xs:Name"/>
<xs:element name="Initials" type="xs:Name"/>
<xs:element name="Phonenumber">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:NMTOKEN">
<xs:attribute name="PhoneType" use="required" form="qualified" type="xs:Name"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
Необходимо также внести изменения в файл Phonebook.xml. Для этого нужно убрать тег <!DOCTYPE...> и добавить дополнительные атрибуты в тег для элемента Phonebook. Например, при использовании DTD начало вашего документа Phonebook.xml может выглядеть так:
<?xml version="1.0" encoding="WINDOWS-1251"?>
<!DOCTYPE Phonebook SYSTEM "pbml.dtd">
<pbml:Phonebook xmlns:pbml="http://www.askit.ru/pbml">
Для использования XML Schema из файла pbml.xsd можно изменить этот код на такой:
<?xml version="1.0" encoding="WINDOWS-1251"?>
<pbml:Phonebook xmlns:pbml="http://www.askit.ru/pbml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.askit.ru/pbml pbml.xsd">
К пункту 2 - проверка созданного вами вручную файла pbml.xsd средствами Stylus Studio:
1) Запустите Stylus Studio и в меню Window выберите Close All, чтобы закрыть учебный проект.
2) При помощи меню File -> Open откройте измененный вами файл Phonebook.xml.
3) В меню XML выберите команду Validate Document. Должно вернуться сообщение "The XML document Phonebook.xml is valid". Если возникла ошибка, постарайтесь самостоятельно ее исправить.
К пункту 3 - генерация XML Schema средствами Stylus Studio на основе существующего файла XML:
1) Закройте в окне Stylus Studio проверенный вами документ Phonebook.xml и откройте его копию с названием StylusPhonebook.xml.
2) Удалите в нем атрибут SchemaLocation для элемента Phonebook ("xsi:schemaLocation="http://www.askit.ru/pbml pbml.xsd").
3) В меню XML выберите команду Generate Schema from XML Content. В открывшемся окне убедитесь, что переключатель установлен в положение "Generate XML Schema" и введите имя создаваемого файла StylusPbml.xsd с указанием полного пути к нему в файловой системе и нажмите на кнопку OK.
4) При помощи меню File -> Open откройте созданный вами файл схемы StylusPbml.xsd и посмотрите возможности работы с ним на вкладках Diagram, Tree и Documentation.
К пункту 4 - генерация XML Schema на основе существующего файла DTD.
1) Запустите программное обеспечение XML Writer и закройте окно мастера, появляющееся при его открытии.
2) В меню File выберите Open и откройте файл pbml.dtd. Затем в меню DTD/Schema выберите команду Convert DTD to Schema. Откроется новое окно, в которое будет помещено сгенерированная схема.
3) В меню File выберите Save As и сохраните схему как WriterPbml.xsd.