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

0

Задача

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

Решение

Для этого рецепта необходим браузер, поддерживающий XSLT-преобра- зования на стороне клиента (IE 6.0 и старше, IE 5.x + MSXML 3.0, Netscape

Navigator 6.1 и старше, Mozilla, Firefox 1.0 и старше, Apple Macintosh Safari (Tiger), и т.д.):

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="application/xml" href="selfcontained.xsl"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pf="http://www.ora.com/XSLTCookbook/namespaces/portfolio">

<portfolio xmlns="http://www.ora.com/XSLTCookbook/namespaces/portfolio"> <investment>

<symbol>IBM</symbol> <current>72.70</current> <paid>65.00</paid> <qty>1000</qty> </investment> <investment>

<symbol>JMAR</symbol> <current>1.90</current> <paid>5.10</paid> <qty>5 0 0 0</qty> </investment> <investment>

<symbol>DELL</symbol> <current>24.50</current> <paid>18.00</paid> <qty>10 0000</qty> </investment> <investment>

<symbol>P</symbol> <current>57.33</current> <paid>63</paid> <qty>10 0</qty> </investment>

</portfolio>

<xsl:output method="html" />

<xsl:attribute-set name="gain-loss-font"> <xsl:attribute name="color"> <xsl:choose>

<xsl:when test="(pf:current – pf:paid) * pf:qty >= 0">black</xsl:when> <xsl:otherwise>red</xsl:otherwise> </xsl:choose>

</xsl:attribute> </xsl:attribute-set>

<xsl:template match="xsl:stylesheet">

<xsl:apply-templates select="pf:portfolio"/> </xsl:template>

<xsl:template match="pf:portfolio"> <html> <head>

<title>Mой поpтфeль</title> </head>

<body bgcolor="#FFFFFF" text="#000000"> <h1>Поpтфeль</h1>

<table border="1" cellpadding="2"> <tbody> <tr>

<th>Символ</th> <th>Тeкущaя aeHa</th> <th>peHa на момeнт покупки</th> <th>Kоличecтво</th> <th>Пpибыли/Убытки</th> </tr>

<xsl:apply-templates/> </tbody> </table> </body> </html> </xsl:template>

<xsl:template match="pf:investment"> <tr>

<td><xsl:value-of select="pf:symbol"/></td> <td><xsl:value-of select="pf:current"/></td> <td><xsl:value-of select="pf:paid"/></td> <td><xsl:value-of select="pf:qty"/></td>

<td><font xsl:use-attribute-sets="gain-loss-font"><xsl:value-of select= "format-number((pf:current – pf:paid) * pf:qty, ‘#,##0.00′)"/></font></td>

</tr> </xsl:template>

В работе этой таблицы стилей принимают участие два компонента. Первый – команда обработки xml-stylesheet, которая говорит браузеру, что таблица стилей и данные, которые она обрабатывает, находятся в одном и том же документе. Сослаться на тот же документ, в котором находится таблица сти­лей, можно с помощью атрибута href="", не указывая имени файла. Это полез­но, если в дальнейшем вы захотите переименовать файл.

Второй – шаблон, который сопоставляется с элементом xsl:stylesheet и пе­ренаправляет обработку на внедренные XML-данные. В данном случае элементы на­ходятся в пространстве имен http://www.ora.com/XSLTCookbook/namespaces/ portfolio.

Обсуждение

Этот рецепт представляет собой трюк, которым можно поражать друзей. В каком- то смысле перемешивание содержимого и стилизации в одном документе противоре­чит самому духу технологии. Однако иногда иметь единственный файл удобно, поэтому нечего стыдиться, если этот рецепт отвечает вашим целям.

Официально для достижения такого результата следует внедрять табли­цу стилей в документ, а не наоборот. Подробности см. в разделе http:// www.w3.org/TR/xslt#section-Embedding-Stylesheets спецификации XSLT 1.0 или в разделе http://www.w3.org/ TR/xslt20/#embedded для XSLT 2.0. К сожа­лению, IE пока не поддерживает внедренных таблиц стилей, поэтому прихо­дится идти в обход.

Для доставки содержимого в такой форме не обязательно помещать его непос­редственно в файл вместе с таблицей стилей. Ниже показано, как объединить таб­лицу стилей и XML-файл в замкнутый пакет. Требуется лишь, чтобы XML-дан- ные находились в некотором пространстве имен, а таблица стилей начинала обработку не с корневого элемента (/).

<!– generate-selfcontained.xslt –>

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

<!– Повторно используем тождественное преобразование –> <xsl:import href="../util/copy.xslt"/>

<!– Эта таблица стилей генерирует другую таблицу стилей, поэтому используем префикс xso в качестве псевдонима xsl —> <xsl:namespace-alias stylesheet-prefix="xso" result-prefix="xsl"/>

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:strip-space elements="*"/>

<!– Выбрасывать пробелы из текстовых узлов не стоит –>

<xsl:preserve-space elements="xsl:text"/>

<!– Имя файла, содержащего xml-данные –> <xsl:param name="datafile"/> <!– Имя результирующего файла –> <xsl:param name="outfile"/>

<xsl:template match="/">

<!– Вставляем команду обработки, которая сообщает браузеру о том, что $outfile — таблица стилей –>

<xsl:processing-instruction name="xml-stylesheet"> <xsl:text>type="application/xml" href="</xsl:text> <xsl:value-of select="$outfile"/>"<xsl:text/> </xsl:processing-instruction>

<xsl:apply-templates/>

</xsl:template>

<xsl:template match="xsl:stylesheet">

<xsl:copy>

<xsl:copy-of select="@*"/>

<xsl:apply-templates/>

<!– Generate the xslt that tells the <xso:template match="xsl:stylesheet">

<xso:apply-templates select="{name(document($datafile)/*)}"/> </xso:template>

<!– Вставляем данные –>

<xsl:copy-of select="document($datafile)"/> </xsl:copy> </xsl:template> </xsl:stylesheet>

Эту таблицу стилей можно использовать для преобразования другой таб­лицы и ассоциированных с ней данных в замкнутый документ, осуществляю­щий преобразование в HTML. Исходным файлом должна быть таблица сти­лей, которой имя файла данных передается в виде параметра $datafile. Необходим еще параметр $outfile, чтобы правильно генерировалась коман­да обработки xml-stylesheet.

Для генерации выходного файла можно запустить Saxon из командной строки:

saxon -o self-contained.xsl pf-portfolio.xslt generate-selfcontained.xslt datafile="pf-portfolio.xml" outfile="self-contained.xsl"

Здесь self-contained.xsl – имя результирующей таблицы стилей, а pf- portfolio.xslt -таблица стилей, объединяемая с файлом данных pf-portfolio.xml.

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

По теме:

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