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