Главная » XSLT » Создание документов связанных гиперссылками

0

Задача

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

Решение

Обычно, преобразуя XML в HTML, выполняют два или более проходов по XML-файлу, чтобы создать индексные страницы и содержимое. Индексные стра­ницы содержат ссылки на содержимое. (Для этого достаточно XSLT 1.0.) В следу­ющем решении из файла SalesBySalesPerson.xml (см. главу 2) генерируется индекс и сводные страницы.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://icl.com/saxon" extension-element-prefixes="saxon">

<xsl:output method="html"/>

<xsl:template match="/">

<xsl:apply-templates select="*" mode="index"/>

<xsl:apply-templates select="*" mode="content"/> </xsl:template>

<!– = = = = = = = = = = = = = = = = = –> <!–       Создать index.html (mode = "index")   –>

<!– = = = = = = = = = = = = = = = = = –> <xsl:template match="salesBySalesperson" mode="index"> <saxon:output href="index.html"> <html> <head>

^^^^ндекс файла продаж в разрезе продавцов<^^^> </head>

<body bgcolor="#FFFFFF" text="#000000"> <h1>Продажи в разрезе продавцов</М>

<xsl:apply-templates mode="index"/> </body> </html>

</saxon:output> </xsl:template>

<xsl:template match="salesperson" mode="index"> <h2>

<a href="{concat(@name,’.html’)}">

<xsl:value-of select="@name"/> </a> </h2> </xsl:template>

<!– = = = = = = = = = = = = = = = = = –> <!–       Создать gname.html (mode = "content")  –>

<!– = = = = = = = = = = = = = = = = = –>

<xsl:template match="salesperson" mode="content"> <saxon:output href="{@name}.html"> <html> <head>

<title><xsl:value-of select="@name"/> Sales</title> </head>

<body bgcolor="#FFFFFF" text="#000000">

<h1><xsl:value-of select="@name"/> Sales</h1> <ol>

<xsl:apply-templates mode="content"/> </ol> </body> </html> </saxon:output> </xsl:template>

<xsl:template match="product" mode="content"> <li><xsl:value-of

select="@sku"/>&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;$<xsl:value- of select="@totalSales"/></li> </xsl:template>

</xsl:stylesheet>

Обратите внимание, как с помощью режимов мы отделяем преобразование элементов XML в индекс от преобразования информационного содержимого

в HTML-страницы для каждого продавца. Режимы используются для преобразо­вания в HTML очень часто, так как позволяют с помощью единственной таблицы стилей построить разные представления одного и того же документа.

Эта таблица спроектирована для пакетной обработки. Ее можно параметризо­вать, указав, какой документ создавать. Заодно параметр устранил бы необходи­мость в использовании нестандартного расширения saxon:output (которое было бы не нужно при использовании XSLT 2.0).

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html"/>

<!– Используется для задания выходного документа –> <!– INDEX : создать индексную страницу –>

<!– Имя продавца : создать страницу для этого продавца –> <xsl:param name="which" select="’INDEX’"/>

<xsl:template match="/"> <xsl:choose>

<xsl:when test="$which=’INDEX’">

<xsl:apply-templates select="*" mode="index"/> </xsl:when> <xsl:otherwise>

<xsl:apply-templates select="*/salesperson[@name = $which]" mode="content"/>

</xsl:otherwise> </xsl:choose>

</xsl:template> <!– = = = = = = = = = = = = = = = = = — >

<!–  Создать index.html (mode = "index")             –>

<!– = = = = = = = = = = = = = = = = = — >

<xsl:template match="salesBySalesperson" mode="index">

<!– saxon:output удалено. Остальное не изменилось. –>

</xsl:template>

<!– … –>

<xsl:template match="salesperson" mode="content">

<!– saxon:output удалено. Остальное не изменилось. –>

</xsl:template>

<!– … –>

Этот подход станет надежнее, если в качестве параметра передавать не имя, а идентификатор продавца.

Обсуждение

В этом решении не создается ничего особенно впечатляющего, просто ил­люстрируется механизм генерации связанного HTML-контента. Для создания всех Web-страниц одной таблицей стилей пришлось воспользоваться нестандарт­ным для XSLT 1.0 элементом (saxon:output). Аналогичные расширения есть и во многих других процессорах, а в XSLT 2.0 появилась команда xsl:result- document.

Эта таблица стилей порождает относительные ссылки, что в большинстве случаев и требуется. Если же нужны абсолютные ссылки, то лучше не «зашивать» в код URL, а передать его в виде параметра:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html"/>

<xsl:param name="URL" select="http://www.mycompany.com/"/>

<!– опущено … –>

<xsl:template match="salesperson" mode="index"> <h2>

<a href="{$URL}{@name}.html’">

<xsl:value-of select="@name"/> </a> </h2>

</xsl:template>

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии