Создание нескольких результирующих документов настолько распространенная задача, что практически все процессоры XSLT позволяют вам это сделать, даже в XSLT 1.0, где отсутствуют необходимые для этого средства. Процессоры XSLT добавляют для этого новые элементы расширения. Например, Xalan предоставляет элемент , позволяющий написать новый результирующий документ. Для работы с этим элементом нужно создать новый префикс пространства имен — здесь я использую «xalan» — которое Xalan использует для элемента, «com.lotus.xsl.extensions.Redirect», и указать, что этот новый префикс является префиксом элемента расширения:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="com.lotus.xsl.extensions.Redirect"
extension-element-prefixes="xalan">
.
.
.
Теперь при помощи атрибута file
элемента можно записать новый файл:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="com.lotus.xsl.extensions.Redirect"
extension-element-prefixes="xalan">
.
.
.
Here's some text.
В процессоре Saxon применяйте элемент . Для этого элемента я использую префикс «saxon», который соответствует URI «http://icl.com/saxon»:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://icl.com/saxon"
extension-element-prefixes="saxon">
.
.
.
Here's some text.
To же можно сделать и в XT; в этом случае используйте пространство имен и атрибут href
для задания имени нового файла:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xt="http://www.jclark.com/xt"
extension-element-prefixes="xt">
.
.
.
Here's some text.
Все это создало весьма запутанную ситуацию, поскольку каждый разрабатывал свои собственные решения. По этой причине в XSLT 1.1 для поддержки нескольких результирующих документов был представлен новый элемент, , со следующими атрибутами:
• href
(обязательный). Показывает, где будет помещен новый документ. Устанавливается в абсолютный или относительный URI, без идентификатора фрагмента;
• method
(необязательный). Определяет метод вывода, используемый для создания результирующего документа. Устанавливается в «xml», «html», «text» или QName, не являющееся NCName;
• version
(необязательный). Определяет версию выходного документа. Устанавливается в NMTOKEN;
• encoding
(необязательный). Устанавливает кодировку выходного документа. Устанавливается в строку;
• omit-xml-declaration
(необязательный). Устанавливается в «yes» или «no», чтобы опустить объявление XML или не отпускать;
• cdata-section-elements
(необязательный). Задает имена тех элементов, чье содержимое нужно вывести как разделы CDATA. Устанавливается в список QName, разделенных символами-разделителями;
• doctype-public
(необязательный). Задает открытый идентификатор, который будет использован в объявлениивывода. Устанавливается в строковое значение;
• doctype-system
(необязательный). Задает системный идентификатор, который будет использован в объявлениивывода. Устанавливается в строковое значение;
• indent
(необязательный). Определяет, будет ли выходной документ выровнен для отображения структуры вложенности. Устанавливается в «yes» или «no»;
• media-type
(необязательный). Устанавливает тип MIME вывода. Устанавливается в строковое значение;
• standalone
(необязательный). Определяет, будет ли отдельное объявление включено в выходные данные, и если да, устанавливает его значение. Устанавливается в «yes» или «no».
Этот элемент содержит тело шаблона.
Следующий пример основан на упрощенной таблице стилей. В этом случае я создал в HTML-документе две рамки (frame), а также два HTML-документа для отображения в этих рамках ( frame1.html
и frame2.html
). Первую рамку и ее документ я создал следующим образом:
Two Frames
This is frame 1.
.
.
.
Затем я могу создать вторую рамку и ее документ:
Two Frames
This is frame 1.
This is frame 2.
Заметьте, однако, что этот пример работоспособен только в XSLT 1.1.
На момент написания книги в одном процессоре XSLT элемент был реализован: это Saxon версии 6.2.1 и старше, в котором свой элемент был изменен на . Но пока это единственный известный мне процессор XSLT, поддерживающий этот элемент.
Элемент : генерация таблиц стилей
Одна из основных задач XSLT состоит в преобразовании одних таблиц стилей в другие, хотя на первый взгляд это может быть неочевидно. Например, вам может потребоваться обработать длинные правила, которые нужно настроить непосредственно перед обработкой документов. И, как вы знаете, первоначально XSLT был представлен прежде всего для облегчения создания таблиц стилей объектов форматирования.
Читать дальше