Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-08.doc
Скачиваний:
5
Добавлен:
12.05.2015
Размер:
422.91 Кб
Скачать

5.3.20 Использование расширений вXslt

5.3.20.1. Средства расширенияXslt

Язык XSLTявляется специализированным языком программирования, в котором практически отсутствуют стандартные возможности обычных языков программирования, например, работа с текстом, датами и т.д. Разработчики языка отказались от дублирования средств обычных языков программирования вXSLT. Вместо этого спецификация XSLT позволяет процессорам предоставлять интерфейсы для расширения XSLT иXPathза счет использо­вания других языков программирования, например,Java,JavaScriptилиC/C++.

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

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

Обычно, если при выполнении преобразования XSLTпроцессор встречает незнакомый элемент (например, дескрипторHTML), то он просто копирует его в выходной документ. Если же встречается незнакомая функция, то процессор либо выдает ошибку, либо игнорирует вызов этой функции. Поэтому для того, чтобы использовать элементы расширения в преобразованиях, необходимо:

  • задать пространство или пространства имен для элементов и/или функций расширения;

  • определить это пространство имен в атрибуте extension-element-prefixesэлементаxsl:stylesheetилиxsl:transform, либо корневого элемента (при использовании упрощенной записи);

  • использовать в преобразовании элемент или функцию с заданным префиксом.

Кроме того, если в выходном документе необходимо исключить некоторые префиксы из заданного пространства имен расширения их надо задать в атрибуте exclude-result-prefixesэлементаxsl:stylesheetилиxsl:transform, либо корневого элемента упрощенной записи.

Для того, чтобы определить, поддерживает ли процессор элемент или функцию расширения,вXSLTвведены две функции:

булевское-значениеelement-available(строка)

и

булевское-значениеfunction-available(строка).

В качестве аргументов этих функций задается имя элемента или функции. Функции возвращают значение true, если элемент или функция доступны в процессоре иfalse– в противном случае.

Пример использования элементов element-available и function-available:

Следующие фрагменты преобразования проверяют возможность использования элемента xsl:commentи функцииsum()для выходного документаHTML:

<xsl:choose>

<xsl:when test="element-available('xsl:comment')">

<p>xsl:comment is supported.</p>

</xsl:when>

<xsl:otherwise>

<p>xsl:comment is not supported.</p>

</xsl:otherwise>

</xsl:choose>

<xsl:choose>

<xsl:when test="function-available('sum')">

<p>sum() is supported.</p>

</xsl:when>

<xsl:otherwise>

<p>sum() is not supported.</p>

</xsl:otherwise>

</xsl:choose>.

Кроме этого, в XSLTопределен элементxsl:fallback, определяющий инструкции, которые будут выполняться, если процессор не поддерживает какой-либо элемент расширения. Этот элемент имеет следующий синтаксис:

<xsl:fallback>

<!-- Содержимое: шаблон -->

</xsl:fallback>.

Пример использования элемента xsl:fallback:

Следующий фрагмент преобразования в случае отсутствия в процессоре элемента xsl:loopвыполняет вместо него элементxsl:for-each:

<xsl:loop select="from">

<xsl:fallback>

<xsl:for-each select="title">

<xsl:value-of select="."/>

</xsl:for-each>

</xsl:fallback>

</xsl:loop>.

Соседние файлы в папке Лекции