Главная » XSLT » Расщепление документов

0

Задача

Требуется разнести элементы из одного документа по нескольким поддоку- ментам.

Решение XSLT 1.0

В XSLT 1.0 приходится опираться на широко распространенное, но все же не­стандартное расширение, которое позволяет выводить несколько документов1.

В этом решении определяется подлежащий сериализации уровень в структуре до­кумента и имя результирующего файла. Следующая таблица стилей разбивает файл salesBySalesPerson.xml из главы 4 на отдельные файлы – по одному для каж­дого продавца. Она работает для процессора Saxon. Этот процессор также допус­кает использование элемента xsl:document, если в элементе stylesheet за­дан атрибут version ="1.1". Некоторые другие процессоры поддерживают элемент exslt:document из проекта EXSLT.org1.

Если вы предпочитаете не пользоваться версией 1.1, можете воспользоваться расширением saxon:output.

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:include href="copy.xslt"/>

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

<xsl:template match="salesperson"> <xsl:variable name="outFile"

select="concat(‘salesperson.’,translate(@name,’ ‘,’_’),’.xml’)"/> <!– Нестандартный элемент xsl:document, поддерживаемый saxon! –> <xsl:document href="{$outFile}"> <xsl:copy>

<xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:copy> </xsl:document> </xsl:template>

<xsl:template match="salesBySalesperson">

<xsl:apply-templates/> </xsl:template>

</xsl:stylesheet>

Обсуждение

Хотя приведенная выше таблица стилей ориентирована на Saxon, подобная техника работает в большинстве процессоров XSLT 1.0 с минимальными измене­ниями. В Saxon поддерживается также нестандартный элемент saxon:output (xmlns: saxon ="http://icl.com/saxon"). В процессоре Xalan есть расшире­ние xalan:redirect (xmlns:xalan = "http://xml.apache.org/xalan").

Интересная вариация на тему расщепления – дополнительное порождение выходного файла, который включает сгенерированные подфайлы с помощью ко­манд xinclude:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="copy.xslt"/>

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

<xsl:template match="salesperson"> <xsl:variable name="outFile"

select="concat(‘salesperson.’,translate(@name,’ ‘,’_’),’.xml’)"/> <xsl:document href="{$outFile}"> <xsl:copy>

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

<xi:include href="{$outFile}"

xmlns:xi="http://www.w3.org/2001/XInclude"/>

</xsl:template>

</xsl:stylesheet>

Если вас беспокоит, что ваш процессор XSLT в один прекрасный день начнет поддерживать спецификацию XInclude и ошибочно попытается включить тот файл, который только что был выведен, можете заменить элемент xi:include на xsl:element:

<xsl:element name="xi:include"

xmlns:xi="http://www.w3.org/2 0 01/XInclude"> <xsl:attribute name="href">

<xsl:value-of select="$outFile"/> </xsl:attribute> </xsl:element>

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

По теме:

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