Преобразование XML в HTML

28 Oct
2001

Продолжим изучение XML. Руководство поставило перед вами задачу создать страницу, которая бы содержала список отделов и их сотрудников со ссылками, на адреса электронной почты и домашние страницы.

Прежде всего нам необходимо разработать структуру этих данных. На языке XML это делается очень просто, например так:

<ENTERPRISE>
<TITLE>Ентерпрайз</TITLE>
<HOMEPAGE>httр://enterprise.com/</HOMEPAGE>
<DEPARTMENT>
<TITLE>Отдел продаж</TITLE>
<EMAIL>sales@enterprise.com</EMAIL>
<HOMEPAGE>httр://enterprise.com/sales/</HOMEPAGE>
<PERSON>
<FIRSTNAME>Иван</FIRSTNAME>
<SECONDNAME>Петров</SECONDNAME>
<POSITION>Начальник отдела</POSITION>
<EMAIL>petrov@enterprise.com</EMAIL>
</PERSON> <PERSON>
<FIRSTNAME>Сидор</FIRSTNAME>
<SECONDNAME>Иванов</SECONDNAME>
<POSITION>Менеджер</POSITION>
<EMAIL>sidor@enterprise.com</EMAIL>
</PERSON>
</DEPARTMENT>
</ENTERPRISE>

В принципе, уже эту структуру можно просмотреть с помощью браузера, поддерживающего XML (<A href="httр://exper.ural.ru/ent.xml">ent.xml</A>), только необходимо добавить обязательный элемент, указывающий версию использованных рекомендаций XML. Первая строка XML-файла должна выглядеть так:

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

Второй параметр указывает кодировку, в которой хранятся XML-файлы. Кстати, XML изначально разрабатывался с учетом того, что данные могут храниться и отображаться в различных кодировках. Причем, указанная кодировка определяет не только кодировку данных, но и кодировку описания самой структуры. Т.е. ничто не мешает написать, например

<ПРЕДПРИЯТИЕ> </ПРЕДПРИЯТИЕ>.

Для того, чтобы браузер отображал нашу структуру в виде HTML-странички, необходимо описать правила, по которым интерпретатор XML проведет преобразование XML в HTML. Осуществляется это с помощью языка XSL (eXtensible Stylesheet Language), точнее его модификации XSLT (T - transformation) - языка описания трансформации одного XML-представления в другое (напомню, что HTML-документ является XML-документом, следовательно, XSLT можно использовать для преобразования XML в HTML).

XSLT-скрипт, сам по себе, является XML-документом, каждый элемент которого, является инструкцией интерпретатору. Корневым элементом XSL-скриптов является элемент <xsl:stylesheet>. Т.е. любой XSLT-скрипт, в качестве корневого элемента, должен использовать элемент <xsl:stylesheet>. В большинстве случаев он должен быть записан вот так:

<xsl:stylesheet xmlns:xsl="httр://www.w3.org/TR/WD-xsl">

Параметр xmlns:xsl указывает на используемое пространство имен, что позволяет правильно интерпретировать имена элементов, так как, по природе xml, вполне вероятна ситуация, когда разные разработчики могут использовать одинаковые имена для элементов, но вкладывать в них различный смысл и подразумевать различные действия интерпретатора. Явно указав пространство имен, мы можем быть уверены, что все элементы, содержащиеся в корневом элементе <xsl:stylesheet> будут интерпретированы именно так, как подразумевал разработчик.

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

Соответствие устанавливается инструкцией (или элементом в терминологии XML):

<xsl:template match="<I>путь к элементу</I>">
</xsl:template>

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

Пути записываются примерно так же, как вы привыкли записывать пути файлов. "/" - означает корневой элемент. В нашем случае, "/DEPARTMENT/HOMEPAGE" будет означать элемент HOMEPAGE, содержащийся внутри элемента <DEPARTMENT></DEPARTMENT>, а "/HOMEPAGE" - элемент HOMEPAGE, содержащийся внутри корневого элемента <ENTERPRISE></ENTERPRISE>.

Таким образом, в конструкции:

<xsl:template match="/">
<!--шаблон для корневого элемента-->
</xsl:template>

на месте комментария можно написать шаблон, который будет "отдаваться" браузеру, если интерпретатор встретит корневой элемент. Т.е. это может быть "шапка" страницы. Предлагаю взглянуть на примерный шаблон для реализации поставленной нами задачи (преобразование XML-документа в HTML-документ):
1:<xsl:stylesheet xmlns:xsl="httр://www.w3.org/TR/WD-xsl">
2: <xsl:template match="/">
3: <xsl:apply-templates />
4: </xsl:template>
5: <xsl:template match="ENTERPRISE">
6: <html> 7: <head>
8: <title><xsl:value-of select="TITLE" ></title>/9:
< head>/10:
<body> 11:
<H2><xsl:value-of select ><="" H2>/12:/<xsl:apply-templates
> 13: /< body> 14:/<
html> 15:/< xsl:template> 16:/<
xsl:stylesheet> Перед/тем,

как начать описывать шаблоны элементов, которые встречаются в XML-документе, необходимо заставить интерпретатор начать разбор с корневого элемента. Сделать это надо с помощью конструкции в строках 2-4 этого листинга. В строке

3 применена XSLT-инструкция <xsl:apply-templates >. Она /дает интерпретатору команду продолжить разбор всех вложенных элементов. Другими словами, в то место, в котором встречена данная инструкция, будут вставлены все шаблоны
дочерних элементов по отношению к тому, шаблон которого интерпретируется в данный
момент (в данном случае - всех элементов структуры, описанной в XML-файле. Эта же
инструкция применяется в шаблоне для элемента ENTERPRISE. В это место будут выведены шаблоны
всех дочерних элементов элемента ENTERPRISE. Если опустить инструкцию в строке
12, то интерпретатор проведет разбор только элемента ENTERPRISE, не вдаваясь "в
дальнейшие подробности". Еще одна

новая инструкция, это - <xsl:value-of select , которая,=""как вы уже догадались, заменяется значением содержимого соответствующего элемента. В данном случае (строка 8), она будет заменена на содержимое элемента TITLE, являющегося дочерним по отношению к элементу ENTERPRISE (но не к элементу TITLE, дочернему по отношению к DEPARTMENT). Кроме того, эта инструкция может подставлять" значение "атрибутов самого элемента. Для этого в атрибуте select необходимо указать имя атрибута, предварив его символом @. Например, конструкция <xsl:value-of select > внутри=""шаблона <xsl:template match > будет=""заменена на значение атрибута SRC элемента IMG. Для того, чтобы получить содержимое, самого интерпретируемого в данный момент элемента, необходимо применять, значение ." для "атрибута select (как я уже говорил, пути, в основном, подчиняются тем же правилам, что и пути к файлам в файловой системе, где точка соотвтетствует текущей директории). Попробуем собрать

все это вместе. XSLT-скрипт, который мы хотим применить
для преобразования нашего XML-файла в HTML-представление, необходимо указать в
XML-файле с помощью элемента: <?xml-stylesheet type

href ?>="" А="" сам

скрипт дополним шаблонами для других элементов Листинги файлов:

<A href

>ent_xslt.xml< A>=""-/файл, содержащий данные в XML-представлении:<?xml version encoding ?>="" <?xml-stylesheet=""type

href ?>="" <ENTERPRISE>=""<TITLE>Ентерпрайз<
TITLE>
<HOMEPAGE>httр:/enterprise.com
<//HOMEPAGE>/<DEPARTMENT>/<TITLE>Отдел
продаж<
TITLE> <EMAIL>sales@enterprise.com</EMAIL>
<HOMEPAGE>httр:/enterprise.com
sales//</HOMEPAGE>/<PERSON>/<FIRSTNAME>Иван<
FIRSTNAME>
<SECONDNAME>Петров</SECONDNAME>
<POSITION>Начальник/отдела<
POSITION> <EMAIL>petrov@enterprise.com</EMAIL>
</PERSON>
<PERSON>/<FIRSTNAME>Сидор<
FIRSTNAME>
<SECONDNAME>Иванов</SECONDNAME>
<POSITION>Менеджер</POSITION>
<EMAIL>sidor@enterprise.com</EMAIL>
</PERSON>
</DEPARTMENT>
</ENTERPRISE>
<A/href

>ent.xsl< A>-=""файл,/содержащий XSLT-скрипт для преобразования XML-документа в HTML-представление: <?xml version

encoding ?>="" <xsl:stylesheet=""xmlns:xsl
>
<xsl:template=""match
> <xsl:apply-templates><=""xsl:apply-templates>
</xsl:template>
<xsl:template/match >

<HTML>=""<HEAD>
<TITLE><xsl:value-of select
><
TITLE>="" </HEAD>/<BODY>
<H2><xsl:value-of/select
><
H2>
домашняя="" страница:/<A>/<xsl:attribute
;name >
<xsl:value-of
select >=""<
xsl:attribute> <xsl:value-of="" select/>
</A>
<HR >="" <H3>Отделы:</H3>
<xsl:apply-templates/>
< /BODY>
</HTML>
< /xsl:template>
<xsl:template/match
>/<B
STYLE/><xsl:value-of

select ><=""B>
(<A><xsl:attribute name="HREF"> <xsl:value-of="" select/>/<

xsl:attribute> <xsl:value-of=""select
>< A>)="" <xsl:apply-templates/>
</xsl:template>
<xsl:template match="PERSON" >/<BR/><xsl:value-of
select />
<xsl:value-of/select

> <A><xsl:attribute=""name
> /mailto:<xsl:value-of select="EMAIL" >/< xsl:attribute> <xsl:value-of="" select/><
A> <=""xsl:template>
< xsl:stylesheet>="" Я/думаю,

что/на
сегодня информации="" более,/чем,/достаточно.]]
/

/

>

Комментировать

Вы должны войти чтобы комментировать.

Наверх