Технология XSLT
Шрифт:
Листинг 9.18. SQL-скрипт, загружающий документ и преобразование в БД
 – - Сохраняем преобразование
 INSERT INTO STYLESHEET VALUES
 (1, '<xsl:stylesheet '||
  ', version="1.0" '||
  ' xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> '||
  ' <xsl:template match="A"> '||
  ' <B><xsl:value-of select="."/></B> '||
  ' </xsl:template> '||
  ' </xsl:stylesheet> ');
  – - 
Сохраняем документ
 INSERT INTO SOURCE VALUES
 (1, '<A>value</A>', 1);
 Для того чтобы выполнять преобразования в
SELECT
– выражении представления таблицы SOURCE
, мы напишем функцию PROCESS
, которая будет возвращать результат обработки документа с уникальным идентификатором, заданным параметром sourceID
. Листинг 9.19. Функция PROCESS
 CREATE OR REPLACE FUNCTION PROCESS (sourceID NUMBER) RETURN VARCHAR2 IS
   -- Инициализация XML-парсера и XSLT-процессора
  parser XMLPARSER.Parser := XMLPARSER.newParser;
  processor XSLPROCESSOR.Processor := XSLPROCESSOR.newProcessor;
   -- Переменные для CLOB-значений входящего документа и преобразования
  sourceCLOB CLOB;
  stylesheetCLOB CLOB;
   -- Переменные для DOM-объектов входящего документа и преобразования
  sourceXML XMLDOM.DOMDocument;
  stylesheetXML XMLDOM.DOMDocument;
   -- Переменная для объекта преобразования
  stylesheet XSLPROCESSOR.Stylesheet;
   -- Переменная результата
  result varchar2(32767);
  BEGIN
   -- Получаем CLOB-значение входящего документа в переменную sourceCLOB
  SELECT CONTENT
  INTO sourceCLOB
  FROM SOURCE
  WHERE ID = sourceID;
   -- Получаем CLOB-значение соответствующего преобразования
  SELECT STYLESHEET.CONTENT
  INTO stylesheetCLOB
  FROM STYLESHEET, SOURCE
  WHERE SOURCE.ID = sourceID AND SOURCE.STYLESHEETID = STYLESHEET.ID;
   -- Если хотя бы одно из значений - NULL, прерываем обработку
  -- 
и возвращаем NULL
  IF sourceCLOB IS NULL OR stylesheetCLOB IS NULL THEN
  RETURN NULL;
  END IF;
   -- Разбираем CLOB-значение входящего документа
  XMLPARSER.parseCLOB(parser, sourceCLOB);
  sourceXML := XMLPARSER.getDocument(parser);
   -- Разбираем CLOB-значение документа преобразования
  XMLPARSER.parseCLOB(parser, stylesheetCLOB);
  stylesheetXML := XMLPARSER.getDocument(parser);
   -- Инициализируем объект преобразования
  stylesheet := XSLPROCESSOR.newStylesheet(stylesheetXML, NULL);
   -- Выполняем преобразование
  XSLPROCESSOR.processXSL(processor, stylesheet, sourceXML, result);
   -- Освобождаем ресурсы
  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
 – - ------------ ------------
 
    
        Поделиться:
    
    
            Популярные книги
        
 
        
    На границе империй. Том 9. Часть 3
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
 
                    5.00 
 					
            рейтинг книги
Вперед в прошлое 5
5. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
 
                    5.00 
 					
            рейтинг книги
Темный Лекарь 8
8. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
 
                    5.00 
 					
            рейтинг книги
Леди Малиновой пустоши
Любовные романы:
любовно-фантастические романы
 
                    6.20 
 					
            рейтинг книги
Монстр из прошлого тысячелетия
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
 
                    5.00 
 					
            рейтинг книги
Зубных дел мастер
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
 
                    5.00 
 					
            рейтинг книги
Барон не играет по правилам
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
 
                    5.00 
 					
            рейтинг книги
Стеллар. Заклинатель
3. Стеллар
Фантастика:
боевая фантастика
 
                    8.40 
 					
            рейтинг книги
На границе империй. Том 9. Часть 4
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
 
                    5.00 
 					
            рейтинг книги
Кодекс Крови. Книга ХII
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
 
                    5.00 
 					
            рейтинг книги
Эммануэль
1. Эммануэль
Любовные романы:
эро литература
 
                    7.38 
 					
            рейтинг книги
Законы Рода. Том 8
8. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
 
                    5.00 
 					
            рейтинг книги
Гримуар темного лорда III
3. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
 
                    5.00 
 					
            рейтинг книги
Черный Маг Императора 7 (CИ)
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
 
                    5.00