Главная » XSLT » Вывод нескольких документов

0

Задача

Необходима переносимая таблица стилей для вывода нескольких документов.

Решение

Хотя в большинстве реализаций XSLT 1.0 имеются расширения, помогающие обрабатывать несколько документов, все они немного различаются между собой. А в XSLT 2.0 есть команда xsl:result-document.

Эта команда обладает следующими атрибутами:

format

Задает имя формата вывода, объявленного в именованной команде xsl:output.

href

Определяет место назначения выходного документа.

validation

Определяет способ контроля результирующего дерева.

type

Определяет тип, используемый для контроля результирующего дерева.

Приведенный ниже код разбивает XML-документ на несколько документов в соответствии с группами, которые формирует команда xsl:for-each-group. Каждому выходному документу присваивается имя, в которое в качестве суффик­са добавлен ключ группировки:

<xsl:template match="products">

<xsl:for-each-group select="product" group-by="@type">

<xsl:result-document href="prod-{current-grouping-key()}.xml"> <xsl:copy-of select="current-group()"/> </xsl:result-document> </xsl:for-each-group>

</xsl:template>

Иногда возникает необходимость в таблице стилей, которая выводит доку­менты в разных форматах. Например, по умолчанию принимается формат XML, но допускается также вывод в виде HTML. Для этого воспользуемся имеющим­ся в XSLT 2.0 механизмом для задания нескольких форматов вывода:

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

<xsl:stylesheet version="2.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!– По умолчанию принимается формат XML –>

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

<!— Другой именованный формат для вывода в виде HTML —>

<xsl:output method="html" encoding="UTF-8" indent="yes" name="html-out"/>

<xsl:template match="/"> <xsl:apply-templates/> <xsl:result-document href="result.html" format="html-out">

<xsl:apply-templates mode="html"/> </xsl:result-document> </xsl:template>

<!– Прочие шаблоны –>

</xsl:stylesheet>

Обсуждение

Хотя в самой команде <xsl:result-document> нет ничего сложного, по­тенциально ее можно спутать с другой командой XSLT 2.0 – <xsl:document>. Связано это с тем, что в спецификации XSLT 1.1 (ныне объявленной недействую­щей) также определена команда <xsl:document>, функционирующая подобно <xsl:result-document> из версии 2.0.

В версии 2.0 команда <xsl:document> играет более скромную роль. Ее на­значение – сконструировать документный узел, например для того, чтобы выпол­нить контроль на уровне документа, не прибегая к сериализации. Обычно резуль­тат работы <xsl:document> запоминается в переменной:

<xsl:variable name="tempDoc" as="document(element(*, my:document))"> <xsl:document type="my:document" validation="strict">

<xsl:apply-templates select="/*"/> </xsl:document> </xsl:variable>

Если позже вы захотите вывести этот документ, то сможете сделать это с по­мощью команды <xsl:result-document>:

<xsl:result-document href="doc.xml"> <xsl:copy-of select="$tempDoc"/> </xsl:result-document>

См. также

О том, как вывод нескольких документов реализуется в XSLT 1.0 с помощью расширений, см. рецепт 8.6.

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

По теме:

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