Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания для Лабораторных работ.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
3.54 Mб
Скачать

Использование одного шаблона 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.

Лабораторная работа 1 Создание документов XML

Создание документа в формате XML вручную, создание DTD, обязательные и необязательные элементы, атрибуты XML, утилита Open XML Editor

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

ОСНОВЫ ЯЗЫКА XML

Язык XML (Extensible Markup Language) был разработан рабочей группой XML Working Group консорциума World Wide Web Consortium (W3C). Вот как описывают его создатели:

"Расширяемый язык разметки Extensible Markup Language (XML) представляет собой составную часть языка SGML… Он предназначен для облегчения использования языка SGML в Web и выполнения задач, которые в настоящее время реализуются с помощью языка HTML. XML разработан с целью усовершенствовать применение и взаимодействие языков SGML и HTML."

Это выдержка из спецификации версии 1.0 XML, созданной XML Working Group в феврале 1998 г. Весь документ вы можете найти на сайте W3C по адресу http://www.w3.org/TR/1998/REC-xml-19980210.

XML – язык разметки, разработанный специально для размещения информации в World Wide Web, аналогично языку гипертекстовой разметки HTML (Hypertext Markup Language), который изначально стал стандартным языком создания Web-страниц. Поскольку язык HTML полностью удовлетворяет всем нашим потребностям, возникает вопрос: для чего понадобился совершенно новый язык для Web? В чем состоят его преимущества и достоинства? Как он взаимодействует с HTML? Заменит ли он HTML, или только усовершенствует его? Наконец, что собой представляет язык SGML, частью которого является XML, и почему нельзя использовать для Web-страниц собственно SGML? В этой лекции я постараюсь ответить на все эти вопросы.