KnigaRead.com/

Алексей Валиков - Технология XSLT

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Алексей Валиков, "Технология XSLT" бесплатно, без регистрации.
Перейти на страницу:

   <tr>

    <td>Protocol</td>

    <td>HTTP/1.1</td>

   </tr>

   <tr>

    <td>Method</td>

    <td>GET</td>

   </tr>

   <tr>

    <td>Request URI</td>

    <td>/servlet/example1</td>

   </tr>

   <tr>

    <td>Query string</td>

    <td>x=1&amp;y=2&amp;z=3&amp;x=4&amp;y=5&amp;z=6</td>

   </tr>

  </table>

  <h1>Request parameters</h1>

  <table>

   <tr>

    <td>z</td>

    <td>3</td>

   </tr>

   <tr>

    <td>z</td>

    <td>6</td>

   </tr>

   <tr>

    <td>y</td>

    <td>2</td>

   </tr>

   <tr>

    <td>y</td>

    <td>5</td>

    </tr>

   <tr>

    <td>x</td>

    <td>1</td>

   </tr>

   <tr>

    <td>x</td>

    <td>4</td>

   </tr>

  </table>

  <h1>Session parameters</h1>

  <table>

   <tr>

    <td>v</td>

    <td>4</td>

   </tr>

  </table>

  <h1>Cookies</h1>

  <table>

   <tr>

    <td>content</td>

    <td>apple jam</td>

   </tr>

   <tr>

    <td>JServSessionIdroot</td>

    <td>aaenbyjqc0</td>

   </tr>

  </table>

 </body>

</html>

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

Представим, к примеру, что нам потребовалось перевести названия полей выводимого документа на русский язык — получить текст "Общая информация" вместо "General information" и так далее. В первом случае для внесения этого элементарного представления потребуется переписывать, перекомпилировать и обновлять на сервере сервлет; во втором случае все, что нужно будет сделать, — это исправить несколько строк в файле stylesheet.xsl.

Краткие выводы

В заключение хотелось бы сделать несколько комментариев относительно применения XSLT и вообще XML-технологий.

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

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

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

Другое обстоятельство, которое необходимо принимать во внимание, — это сложность самого преобразования. Базовый набор элементов XSLT вкупе с расширениями уже представляется чрезвычайно мощным средством для выполнения различных преобразований, однако в некоторых случаях даже этого может быть недостаточно. В других случаях мощь XSLT может наоборот оказаться неоправданной — например, с задачей представления внешнего вида HTML-документа в Web-браузере могут великолепно справиться каскадные таблицы стилей (CSS).

Глава 10

Расширения языка XSLT

Что такое расширения?

Предыдущие главы этой книги были посвящены, в основном, тому, что может XSLT. Эти возможности, естественно, далеко не безграничны, да и нельзя ожидать слишком многого от специализированного языка, каким является XSLT.

Вместе с тем в XSLT-преобразованиях может оказаться очень полезной функциональность традиционных языков программирования. Например, математических функций и операторов, имеющихся в XPath, явно недостаточно для выполнения сложных вычислений, которые могут потребоваться в преобразованиях. XSLT не имеет встроенных функций для обращения к базам данных, оставляют желать лучшего средства для работы с множествами, текстовыми данными, датами и временными параметрами, словом задачи, не представляющие никакой сложности в традиционных языках программирования, могут быть чрезвычайно трудоемкими в XSLT. Скажем, тригонометрические функции можно реализовать в XSLT рекурсивными вычислениями последовательностей Тейлора, но насколько проще было бы использовать функции sin и cos.

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

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

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

Рассмотрим примеры.

В языке XPath нет функции, которая генерировала бы псевдослучайное значение. Следующее преобразование приводит пример решения этой задачи с помощью стандартного класса Math языка Java.

Листинг 10.1. Преобразование, использующее класс java.lang.Math

<xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transfоrm"

 xmlns:math="java:java.lang.Math"

 exclude-result-prefixes="math">


 <xsl:template match="/">

  <random><xsl:value-of select="math:random()"/></random>

 </xsl:template>


</xsl:stylesheet>

Результатом выполнения этого преобразования будет документ вида:

<random>0.0538608432986305</random>

Значение 0.0538608432986305 было получено посредством вызова метода random класса java.lang.Math и представляет собой некоторое псевдослучайное значение.

В качестве примера элемента расширения можно привести элемент saxon:entity-ref, определенный в XSLT-процессоре Saxon. Этот элемент создает в выходящем документе сущность с указанным именем.

Листинг 10.2. Использование элемента расширения saxon:entity-ref

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 xmlns:saxon="http://icl.com/saxon"

 extension-element-prefixes="saxon">


 <xsl:template match="/">

  <xsl:text>Everybody</xsl:text>

  <saxon:entity-ref name="nbsp"/>

  <xsl:text>needs</xsl:text>

  <saxon:entity-ref name="nbsp"/>

  <xsl:text>space</xsl:text>

</xsl:template>


</xsl:stylesheet>

Результатом этого преобразования будет текст

Everybody&nbsp;needs&nbsp;space

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

Как это часто бывает, за дополнительные возможности приходится платить. Использование механизма расширений предъявляет определенные требования и накладывает некоторые ограничения.

□ Реализация механизма расширений в текущей версии языка целиком и полностью зависит от производителей процессоров. Вследствие этого интерфейсы расширения различных XSLT-процессоров могут отличаться даже для одного языка программирования. Это в итоге ведет к несовместимости расширений и непереносимости XSLT-решений между различными процессорами.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*