Книга: XSLT
Преобразование XML в реляционную базу данных
Преобразование XML в реляционную базу данных
При обсуждении дополнительных возможностей XSLT стоит упомянуть элементы расширения SQL процессора Saxon. Через драйвер Java Database Connectivity (JDBC) можно работать с реляционными базами данных. Мы уже рассмотрели преобразования из XML в XML, в простой текст, в RTF, в JavaScript и т.д. Теперь пришла очередь преобразованию XML в реляционную базу данных.
РАБОТА С ИНТЕРПРЕТИРУЕМЫМ SAXON
Обратите внимание: для связи с базами данных через JDBC нельзя использовать исполняемый файл для Windows saxon.exe. Нужно запустить реализующий Saxon класс Java com.id.saxon.StyleSheet, как я сделаю в конце примера.
В примере я передам данные planets.xml
в базу данных формата Microsoft Access planets.mdb
. Если вы хотите повторить пример, создайте этот файл базы данных, в нем — таблицу planets
с четырьмя текстовыми полями Name
, Mass
, Radius
и Day
, а оставшуюся часть файла оставьте пустой. В Windows я зарегистрирую этот файл базы данных в качестве источника ODBC с именем «planets» через значок Data Sources (ODBC) (Источники данных (ODBC)) в панели управления (в Windows 2000 он расположен в панели управления в папке Administrative Tools (Администрирование)). При запуске пример считает данные планет из planets.xml
и добавит их в файл базы данных, planets.mdb
.
Для подключения к этой базе данных через JDBC я применил элемент <sql:connect>
процессора Saxon. Префикс пространства имен sql
определяется в Saxon следующим образом:
<xsl:stylesheet
xmlns:sql="http://icl.com/saxon/extensions/com.icl.saxon.sql.SQLElementFactory"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">
.
.
.
Для фактического подключения к источнику данных planets
служит элемент расширения <sql:connect>
с атрибутами database
, user
, password
и driver
. Для работы через JDBC установите атрибут driver
в «sun.jdbc.odbc.JdbcOdbcDriver
», атрибут database
— в источник данных ODBC
, «jdbc:odbc:planets
», а атрибуты user
и password
— в имя пользователя и пароль, нужные для подключения к базе данных. Здесь нам не требуется задавать имя пользователя и пароль, но я задал этим параметрам шаблонные значения, так как они требуются в большинстве приложений баз данных:
<xsl:stylesheet
xmlns:sql="http://icl.com/saxon/extensions/com.icl.saxon.sql.SQLElementFactory"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">
<xsl:param name="database" select="'jdbc:odbc:planets'"/>
<xsl:param name="user"/>
<xsl:param name="password"/>
<xsl:template match="PLANETS">
<sql:connect database="{$database}" user="{$user}"
password="{$password}" driver="sun.jdbc.odbc.JdbcOdbcDriver"
xsl:extension-element-prefixes="sql"/>
<xsl:apply-templates select="PLANET"/>
</xsl:template>
.
.
.
Затем я подключаюсь к источнику данных planets
. Я хочу вставить в базу данных данные из каждого элемента <PLANET>
, для чего я создаю новый шаблон, который выбирает элементы <PLANET>
и вставляет данные в таблицу planets
базы данных при помощи элемента Saxon <sql:insert>
:
<xsl:stylesheet
xmlns:sql="http://icl.com/saxon/extensions/com.icl.saxon.sql.SQLElementFactory"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">
.
.
.
<xsl:template match="PLANETS">
<sql:connect database="{$database}" user="{$user}"
password="{$password}" driver="sun.jdbc.odbc.JdbcOdbcDriver"
xsl:extension-element-prefixes="sql"/>
<xsl:apply-templates select="PLANET"/>
</xsl:template>
<xsl:template match="PLANET">
<sql:insert table="planets" xsl:extension-element-prefixes="sql">
.
.
.
</sql:insert>
</xsl:template>
</xsl:stylesheet>
Элемент <sql:insert>
вставляет в базу данных новую запись. Чтобы присвоить ее полям новые данные, используйте элемент <sql:column>
, установив его атрибут name в имя столбца, в который вы хотите записать данные, и присвоив эти данные атрибуту select
:
<xsl:stylesheet
xmlns:sql="http://icl.com/saxon/extensions/com.icl.saxon.sql.SQLElementFactory"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">
.
.
.
<xsl:template match="PLANET">
<sql:insert table="planets" xsl:extension-element-prefixes="sql">
<sql:column name="Name" select="NAME"/>
<sql:column name="Mass" select="MASS"/>
<sql:column name="Radius" select="RADIUS"/>
<sql:column name="Day" select="DAY"/>
</sql:insert>
</xsl:template>
</xsl:stylesheet>
В идеале этого должно быть достаточно, но при работе с самым последним драйвером Access в конце операции Saxon не сбрасывает все буфера данных. Это значит, что данные о последней планете в planets.xml
, Земле, не будут отправлены в базу данных. Чтобы сбросить буферы данных, я явно вызываю шаблон <PLANET>
как именованный шаблон, применяя <sql:insert>
с данными-заглушкой (листинг 10.11).
Листинг 10.11. Работа с реляционной базой данных
<xsl:stylesheet
xmlns:sql="http://icl.com/saxon/extensions/com.icl.saxon.sql.SQLElementFactory"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">
<xsl:param name="database" select="'jdbc:odbc:planets'"/>
<xsl:param name="user"/>
<xsl:param name="password"/>
<xsl:template match="PLANETS">
<sql:connect database="{$database}" user="{$user}"
password="{$password}" driver="sun.jdbc.odbc.JdbcOdbcDriver"
xsl:extension-element-prefixes="sql"/>
<xsl:apply-templates select="PLANET"/>
<xsl:call-template name="writer"/>
</xsl:template>
<xsl:template match="PLANET" name="writer">
<xsl:choose>
<xsl:when test="NAME">
<sql:insert table="planets"
xsl:extension-element-prefixes="sql">
<sql:column name="Name" select="NAME"/>
<sql:column name="Mass" select="MASS"/>
<sql:column name="Radius" select="RADIUS"/>
<sql:column name="Day" select="DAY"/>
</sql:insert>
</xsl:when>
<xsl:otherwise>
<sql:insert table="planets"
xsl:extension-element-prefixes="sql">
<sql:column name="Name" select="' '"/>
<sql:column name="Mass" select="' '"/>
<sql:column name="Radius" select="' '"/>
<sql:column name="Day" select="' '"/>
</sql:insert>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Эта таблица стилей правильно добавляет три записи в базу данных planets.mdb
: по одной новой записи для каждой из планет. Как я говорил, здесь нельзя использовать готовый исполняемый файл saxon.exe
, нужно применять класс Java com.icl.saxon.StyleSheet
. Сначала нужно включить в classpath
файл saxon.jar
:
C:>set classpath=.;c:saxonsaxon.jar
После этого я могу передать в класс com.icl.saxon.StyleSheet
файл planets.xml
и таблицу стилей из листинга 10.11:
C:>java com.icl.saxon.StyleSheet planets.xml saxonsql.xsl
Теперь все сделано — данные планет вставлены в planets.mdb
. Результаты применения этой таблицы стилей показаны на рис. 10.4, где я открыл planets.mdb
в Microsoft Access. Таким образом, мы рассмотрели преобразование из XML в реляционную базу данных.
Рис. 10.4. Применение расширений SQL Saxon
Еще один аспект XSLT, в котором вам потребуется программирование, это поддержка XSLT на серверах. В качестве демонстрации далее я преобразую planets.xml
при помощи planets.xsl
с использованием активных серверных страниц (Active Server Pages, ASP) фирмы Microsoft, серверных страниц Java (Java Server Pages, JSP) фирмы Sun и сервлетов (servlet) Java, выполняющихся на web-серверах и возвращающих результирующий документ браузеру пользователя.
За недостатком места мы не можем подробно рассмотреть эти технологии, и если вы с ними не знакомы, вы можете получить дополнительную информацию в Интернете (как всегда, URL могут измениться):
• ASP. http://msdn.microsoft.com/workshop/c-frame.htm#/workshop/server/Default.asp (руководство и документация по ASP фирмы Microsoft);
• JSP. http://java.sun.com/products/jsp/ (главная страница Sun, посвященная JSP);
• Сервлеты. http://java.sun.com/products/servlet/ (главная страница Sun, посвященная сервлетам).
- XSLT и JavaScript в Internet Explorer
- Обработка ошибок разбора
- Internet Explorer и динамические стили
- Internet Explorer и участки данных XML
- Вызов Java непосредственно из процессоров XSLT
- Работа с API XSLT для Java
- Взаимодействие Xalan с Java
- Взаимодействие Saxon с Java
- Взаимодействие процессора XSLT Oracle с Java
- Взаимодействие XT с Java
- Преобразование XML в реляционную базу данных
- Применение XSLT с активными серверными страницами
- Применение XSLT с Java Server Pages
- Применение XSLT с сервлетами Java
- LINQ to XML
- Символьные данные в XML-документах
- 7.2.2 MANIFEST.MF and plugin.xml
- Конструкции XML
- Узлы дерева XML-документа
- Структура XML-документа
- Глава 1 Введение в XML
- Резервное копирование базы данных InterBase
- Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Резервное копирование многофайловых баз данных
- Восстановление из резервных копий многофайловых баз данных
- Владелец базы данных