Технология XSLT — страница 47 из 66


 -- Освобождаем ресурсы

 XSLPROCESSOR.freeProcessor(processor);

 XMLPARSER.freeParser(parser);

 XMLDOM.freeDocument(sourceXML);

 XMLDOM.freeDocument(stylesheetXML);

 RETURN result;


 -- Обработка исключений

 EXCEPTION


  -- Если возникла исключительная ситуация

  WHEN OTHERS THEN

   -- Освобождаем ресурсы

   XSLPROCESSOR.freeProcessor(processor);

   XMLPARSER.freeParser(parser);

   XMLDOM.freeDocument(sourceXML);

   XMLDOM.freeDocument(stylesheetXML);


  -- Передаем исключение дальше

  RAISE;

END;

Представление обработанных документов теперь может быть описано совершенно элементарно.

Листинг 9.20. Представление PROCESSED_SOURCE

CREATE OR REPLACE VIEW PROCESSED_SOURCE AS

SELECT ID, PROCESS(ID) AS CONTENT

FROM SOURCE;

Продемонстрируем работу функции

PROCESS
и представления
PROCESS_SOURCE
на примере двух запросов.

Листинг 9.21. Запросы к таблице SOURCE и представлению PROCESSED_SOURCE

SQL> SELECT * FROM SOURCE;


ID  CONTENT       STYLESHEETID

--  ------------  ------------

1   value  1


SQL> SELECT * FROM PROCESSED_SOURCE;


ID CONTENT

-- -------------------------------------------------------

value

Выполнение XSLT-преобразований в Java

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

Не стал исключением и XSLT. Можно смело сказать, что количество XSLT-средств, написанных на Java, превосходит половину вообще всех существующих в настоящее время XSLT-пакетов.

Для того чтобы продемонстрировать использование XSLT в Java, мы приведем два варианта одной и той же программы — серверного приложения (сервлета), которое по запросу клиента будет возвращать информацию о текущем HTTP-сеансе в формате HTML.

Первый вариант сервлета можно назвать "традиционным". В нем HTML-документ создается серией инструкций

out.println(...)
, которые выводят в выходящий поток размеченную HTML-тегами информацию о текущем сеансе.

Листинг 9.22. Традиционный вариант сервлета

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;


public class example extends HttpServlet {

 /**

 * Инициализация.

 */

 public void init(ServletConfig config) throws ServletException {

  super.init(config);

 }


 /**

 * Основной метод сервлета

 */

 public void service(HttpServletRequest request,

  HttpServletResponse response)

  throws ServletException, IOException {

  // Выставляем тип содержимого

  response.setContentType("text/html");

  // Инициализируем выходящий поток

  OutputStreamWriter osw =

   new OutputStreamWriter(response.getOutputStream());

  PrintWriter out = new PrintWriter (response.getOutputStream());

  // Выполняем вывод HTML-страницы

  out.println("");

  // Выводим головную часть HTML-документа

  out.println(" ");

  out.println("  Request information");

  out.println(" ");

  // Выводим тело документа

  out.println(" ");

  // Выводим общую информацию о запросе

  out.println("  

General information

");

  out.println("  ");

  // Выводим имя сервера

  out.println("   
");

  out.println("    
");

  out.println("    
");

  out.println("   
");

  // Выводим порт сервера

  out.println("   
");

  out.println("    
");

  out.println("    
");

  out.println("   
");

  // Выводим адрес запрашивающей стороны

  out.println("   
");

  out.println("    
") ;

  out.println("    
");

  out.println("   
");

  // Выводим название протокола запроса

  out.println("   
");

  out.println("    
");

  out.println("    
");

  out.println("   
");

  // Выводим метод запроса

  out.println("   
") ;

  out.println("    
");

  out.println("    
");

  out.println("   
");

  // Выводим URI запроса

  out.println("   
");

  out.println("    
");

  out.println("    
");

  out.println("   
");

  // Выводим строку запроса

  out.println("   
");

  out.println("    
");

  out.println("    
");

  out.println("   
");

  out.println("  
Server name" + request.getServerName() + "
Server port" + request.getServerPort() + "
Remote address" + request.getRemoteAddr() + "
Protocol" + request.getProtocol() + "
Method" + request.getMethod() + "
Request URI" + request.getRequestURI() + "
Query String" + request.getQueryString() + "
");

  // Выводим параметры запроса

  out.println("  

Request parameters

");

  out.println("  ");

  for (Enumeration e = request.getParameterNames();

   e.hasMoreElements();) {

   String name = e.nextElement().toString();

   String[] values = request.getParameterValues(name);

   for (int i=0; i < values.length; i++) {

    out.println("   
");

    out.println("    
");

    out.println("    
");

    out.println("   
");

   }

  }

  out.println("  
" + name + "" + values[i] + "
");

  // Выводим параметры HTTP-сессии

  out.println("  

Session parameters

");

  out.println("