Для подключения к этой базе данных через 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).
<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>