Технология XSLT
Шрифт:
Таким образом, перед разработчиками языка стояла следующая дилемма: либо дублировать функциональность традиционных языков программирования в XSLT или XPath, либо изыскивать другие средства достижения тех же результатов.
Решение этой проблемы было довольно простым: вместо того, чтобы заново реализовывать все множество функций, которые только могут понадобиться при обработке документов, спецификация XSLT позволяет процессорам предоставлять интерфейсы для расширения XSLT и XPath за счет использования других языков программирования, например, Java, JavaScript или Python.
Существуют два способа расширения XSLT: при помощи функций и элементов расширения.
Рассмотрим примеры.
В языке XPath нет функции, которая генерировала бы псевдослучайное значение. Следующее преобразование приводит пример решения этой задачи с помощью стандартного класса
Результатом выполнения этого преобразования будет документ вида:
Значение
В качестве примера элемента расширения можно привести элемент
Результатом этого преобразования будет текст
Несложно понять, насколько мощным средством являются расширения. Они фактически позволяют
Как это часто бывает, за дополнительные возможности приходится платить. Использование механизма расширений предъявляет определенные требования и накладывает некоторые ограничения.
□ Реализация механизма расширений в текущей версии языка целиком и полностью зависит от производителей процессоров. Вследствие этого интерфейсы расширения различных XSLT-процессоров могут отличаться даже для одного языка программирования. Это в итоге ведет к несовместимости расширений и непереносимости XSLT-решений между различными процессорами.
□ Возможность использования того или иного языка для написания расширений зависит от наличия интерфейса XSLT-процессора для этого языка. Не следует ожидать, что любой процессор сможет работать с расширениями, написанными на любом языке, то есть, иначе говоря, расширения привязывают преобразования к строго определенному процессору или, в лучшем случае, группе процессоров.
□ В то время как сам XSLT не имеет сторонних эффектов, расширения этого принципа придерживаться не обязаны. Вследствие этого преобразования, в которых есть расширения с побочными эффектами могут из-за различных методов обработки входящего документа генерировать на разных процессорах разный результат.
Итак, вопрос, использовать расширения или нет — это вопрос "функциональность против переносимости", и, хотя его решение будет всегда зависеть от конкретной задачи, существуют также и довольно общие критерии оценки, которые мы приведем в следующей таблице (табл. 10.1).
Таблица 10.1. Использование расширений: критерии за и против
Использовать расширения стоит, если: | Использовать расширения не стоит, если: |
---|---|
преобразования будут выполняться на заранее известном процессоре или группе процессоров; | целевой процессор неизвестен. Преобразования должны быть переносимы, насколько это возможно; |
в XSLT нет средств для выполнения требуемой задачи, либо они очень неэффективны; | в XSLT имеются средства для выполнения требуемой задачи; |
преобразование должно обладать побочными эффектами; | преобразование может обойтись без побочных эффектов; |
целевой процессор предоставляет интерфейс для хорошо известного разработчику языка программирования | интерфейс для нужного языка программирования в целевом процессоре отсутствует |
Подводя итог, образно выражаясь, скажем, что расширения — это пушка, стрелять из которой по воробьям рекомендуется только, когда не остается ничего другого, или воробьи достаточно велики.
К сожалению, не представляется возможным описать в одной главе интерфейсы расширения даже наиболее распространенных XSLT-процессоров. Вместо этого мы постараемся изложить основные принципы создания расширения, а также приведем несколько общих примеров, которые смогут послужить основой для создания частных решений.