Добавил:
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.