Валиков Алексей Н.
Шрифт:
Таблица
SOURCE
содержит XML-документы (поле CONTENT
), каждому из которых соответствует некоторое преобразование (внешний ключ STYLESHEETID
). Нашей задачей будет создание представления, в котором документы, хранящиеся в таблице SOURCE
, будут обрабатываться соответствующими преобразованиями из таблицы STYLESHEET
. Прежде всего, создадим таблицы и ключи, соответствующие приведенной выше схеме базы данных.
Листинг 9.15. Создание схемы БД
– - Создаем таблицу stylesheet
CREATE TABLE STYLESHEET
(ID INTEGER NOT NULL,
CONTENT CLOB NULL);
– - Создаем первичный ключ таблицы STYLESHEET
ALTER TABLE STYLESHEET
ADD (PRIMARY KEY (ID));
– - Создаем таблицу SOURCE
CREATE TABLE SOURCE
(ID INTEGER NOT NULL,
CONTENT CLOB NULL,
STYLESHEETID INTEGER NOT NULL);
– - Создаем первичный ключ таблицы SOURCE
ALTER TABLE SOURCE
ADD (PRIMARY KEY (ID));
– - Создаем внешний ключ, связывающий таблицы SOURCE и STYLESHEET
ALTER TABLE SOURCE
ADD (FOREIGN KEY (STYLESHEETID) REFERENCES STYLESHEET);
После того, как схема базы данных была создана, в нее можно добавить записи, содержащие преобразования и обрабатываемые ими документы. Мы ограничимся простым преобразованием и еще более простым документом.
Листинг 9.16. Преобразование
<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>
Листинг 9.17. Обрабатываемый документ
<A>value</A>
Листинг 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