
- •Лекция 4-08
- •5.3.9. Создание текстовых узлов вXslt
- •5.3.9.1. Элементxsl:text
- •5.3.9.2. Элементxsl:value-of
- •5.3.9.3. Встроенные правила шаблона
- •1. Поздравление
- •2. Напоминание
- •5.3.9.4. Обработка пробельных символов
- •5.3.10. Создание узлов документа, комментариев, инструкций по обработке и пространства имен вXslt
- •5.3.10.1. Элемент xsl:document
- •5.3.10.2. Элементxsl:result-document
- •5.3.10.3. Элементxsl:comment
- •5.3.10.4. Элемент xsl:processing-instruction
- •5.3.10.5. Элементxsl:namespace
- •5.3.11. Копирование узлов вXslt
- •5.3.11.1. Элементxsl:copy
- •5.3.11.2. Элементxsl:copy-of
- •5.3.11.3. Элементxsl:sequence
- •5.3.12. Условная и циклическая обработка вXslt
- •5.3.12.1. Элементxsl:if
- •5.3.12.2. Элементы xsl:choose, xsl:when и xsl:otherwise
- •5.3.12.3. Элементxsl:for-each
- •5.3.12.4. Сортировка вXslt
- •5.3.13. Сообщения процессораXslt
- •5.3.14. Псевдонимы пространства имен вXslt
- •5.3.15. Нумерация вXslt
- •3. Поздравление
- •1. Поздравление
- •1. Поздравление
- •01). Поздравление
- •0:00:00:00:01)Поздравление
- •5.3.16. Форматирование чисел в xslt
- •5.3.17. Использование ключей вXslt
- •5.3.18. Переменные, параметры и функции вXslt
- •5.3.18.1. Переменные в xslt
- •5.3.18.2. Вызов именованных правил шаблона
- •5.3.18.3. Параметры в xslt
- •5.3.18.4. Функции стилей в xslt
- •5.3.19. Дополнительные функции xslt
- •5.3.19.1. Функцияdocument()
- •5.3.19.2. Функцияcurrent()
- •5.3.19.3. Функцияgenerate-id()
- •5.3.19.4. Функция system-property()
- •5.3.19.5. Функцияunparsed-entity-uri()
- •5.3.20 Использование расширений вXslt
- •5.3.20.1. Средства расширенияXslt
- •5.3.20.2. Инициатива exslt
- •5.3.20.3. Средства расширения в процессореMsxml
- •5.3.20.4. Средства расширения в процессореSaxon
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>.