Ход этого преобразования лучше всего прокомментирует полученный результат.
Листинг 10.16. Входящий документ
<а>
<a>1</a>
<a>2</a>
</а>
Листинг 10.17. Выходящий документ
<!-- а: -->
<а>
<a>1</a>
<a>2</a>
</а>
<!-- b:-->
<b>
<b>1</b>
<b>2</b>
</b>
<!-- с: -->
<с>
<c>1</c>
<c>2</c>
</с>
Элементы расширения
Другой, несколько реже используемой, но не менее мощной возможностью расширения XSLT являются элементы расширения. В отличие от обычных элементов, при выполнении преобразования элементы расширения не просто копируются в выходящее дерево. При их обработке процессор должен выполнить определенные действия. Например, многие XSLT-процессоры, написанные на Java, позволяют связывать элементы расширения с методами Java-классов.
Пример
Предположим, что при выполнении преобразования в выходящий документ нам необходимо включить информацию о том, когда документ был сгенерирован — добавить элемент вида:
This page was generated at 10:23.
Пожалуй, самым элегантным решением этой задачи будет использование элемента расширения, который копировал бы в выходящий документ текущее время. Иначе говоря, при выполнении шаблона вида:
<xsl:template match="/">
<!-- ... – ->
This page was generated at <ext:time/>.
</xsl:template>
элемент расширения
ext:time
должен быть заменен текущим временем. Ниже мы приведем пример реализации этого элемента для процессора Xalan.
Интерфейс программирования расширений в Xalan требует, чтобы для каждого элемента расширения был определен метод вида:
тип элемент(org.apache.xalan.extensions.XSLProcessorContext context,