<p>This page was generated at <ext:time/>.</p>
</xsl:template>
</xsl:stylesheet>
Результатом этого преобразования будет документ вида:
<p>This page was generated at 11:56.</p>
Функциональность предложенного выше элемента расширения может быть легко расширена. Например, мы можем создать элемент ext:date
, который будет выводить текущую дату или время в формате, зависящем от значения его атрибута pattern
.
package de.fzi.xslt;
import java.util.Date;
import java.text.SimpleDateFormat;
import org.apache.xalan.extensions.XSLProcessorContext;
import org.apache.xalan.templates.ElemExtensionCall;
public class ext{
public String date(XSLProcessorContext context, ElemExtensionCall elem) {
SimpleDateFormat df;
// Получаем значение атрибута pattern элемента расширения
String pattern = elem.getAttribute('pattern');
// Если атрибут pattern не определен,
// используем образец форматирования, определенный по умолчанию
if (pattern == null)
df = new SimpleDateFormat();
// Если атрибут pattern определен, используем его значение
// в качестве образца форматирования
else
df = new SimpleDateFormat(pattern);
return df.format(new Date());
}
}
В преобразовании этот элемент мы можем использовать как:
<p>This page was generated at <ext:date pattern='HH:mm'/> on
<ext:date pattern='dd/MM/yyyy'/>.</p>
или:
<p>This page was generated on <ext:date/>.</p>
В первом случае результатом будет:
<p>This page was generated at 12:11 on 08/10/2001.</p>
Во втором:
<p>This page was generated on 08.10.01 12:11.</p>
Естественно, семантика элементов расширения не ограничивается простым копированием в выходящий документ заданных значений. Элементы расширения могут выполнять гораздо более сложные функции, ограниченные, пожалуй, лишь только воображением разработчика. При этом элементы расширения на удивление удачно вписываются в структуру самого преобразования, ведь принцип их использования не сильно отличается от принципа использования самих элементов XSLT.
Функция
Функция element-available
совершенно аналогична функции function- available
: она служит для проверки доступности в преобразовании того или иного элемента. Строковый параметр element-available
задает расширенное имя элемента; функция возвращает true
, если элемент с таким именем доступен, false
— если нет.
Предположим, что преобразование, созданное нами для процессора Xalan с использованием элемента расширения ext:date
, будет выполняться на каком-либо другом процессоре. В этом случае велика вероятность того, что вследствие несовместимости механизмов расширений это преобразование завершится ошибкой — 'чужой' процессор просто не сможет выполнить элемент ext:date.
Во избежание этого, мы можем использовать функцию element-available
для проверки доступности элемента ext:date
до его вызова.
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:ext='xalan://de.fzi.xslt.ext'
extension-element-prefixes='ext'>
<xsl:template match='/'>
<result>
<xsl:if test='element-available('ext:date')'>
<p>This page was generated at <ext:date pattern='HH:mm'/> on <ext:date pattern='dd/MM/yyyy'/>.</p>
</xsl:if>
</result>
</xsl:template>
</xsl:stylesheet>
Элемент
Другим способом обработки исключительных ситуаций, связанных с невозможностью выполнить тот или иной элемент преобразования, является использование элемента xsl:fallback
. Синтаксическая конструкция этого элемента следующая:
<xsl:fallback>
<!-- Содержимое: шаблон -->
</xsl:fallback>
Элемент xsl:fallback
включается в 'критическую' инструкцию, то есть в элемент, который может быть неизвестен процессору. В случае, если критическая инструкция отрабатывается нормально, содержимое xsl:fallback
попросту игнорируется. Иначе, если процессор в силу некоторых причин не может выполнить критическую инструкцию, вместо нее он будет выполнять