Для подключения к этой базе данных через JDBC я применил элемент <sqclass="underline" connect> процессора Saxon. Префикс пространства имен sql определяется в Saxon следующим образом:
<xsclass="underline" 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 служит элемент расширения <sqclass="underline" connect> с атрибутами database, user, password и driver. Для работы через JDBC установите атрибут driver в «sun.jdbc.odbc.JdbcOdbcDriver», атрибут database — в источник данных ODBC, «jdbc:odbc:planets», а атрибуты user и password — в имя пользователя и пароль, нужные для подключения к базе данных. Здесь нам не требуется задавать имя пользователя и пароль, но я задал этим параметрам шаблонные значения, так как они требуются в большинстве приложений баз данных:
<xsclass="underline" 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">
<xsclass="underline" param name="database" select="'jdbc:odbc:planets'"/>
<xsclass="underline" param name="user"/>
<xsclass="underline" param name="password"/>
<xsclass="underline" template match="PLANETS">
<sqclass="underline" connect database="{$database}" user="{$user}"
password="{$password}" driver="sun.jdbc.odbc.JdbcOdbcDriver"
xsclass="underline" extension-element-prefixes="sql"/>
<xsclass="underline" apply-templates select="PLANET"/>
</xsclass="underline" template>
.
.
.
Затем я подключаюсь к источнику данных planets. Я хочу вставить в базу данных данные из каждого элемента <PLANET>, для чего я создаю новый шаблон, который выбирает элементы <PLANET> и вставляет данные в таблицу planets базы данных при помощи элемента Saxon <sqclass="underline" insert>:
<xsclass="underline" 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">
.
.
.
<xsclass="underline" template match="PLANETS">
<sqclass="underline" connect database="{$database}" user="{$user}"
password="{$password}" driver="sun.jdbc.odbc.JdbcOdbcDriver"
xsclass="underline" extension-element-prefixes="sql"/>
<xsclass="underline" apply-templates select="PLANET"/>
</xsclass="underline" template>
<xsclass="underline" template match="PLANET">
<sqclass="underline" insert table="planets" xsclass="underline" extension-element-prefixes="sql">
.
.
.
</sqclass="underline" insert>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Элемент <sqclass="underline" insert> вставляет в базу данных новую запись. Чтобы присвоить ее полям новые данные, используйте элемент <sqclass="underline" column>, установив его атрибут name в имя столбца, в который вы хотите записать данные, и присвоив эти данные атрибуту select:
<xsclass="underline" 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">
.
.
.
<xsclass="underline" template match="PLANET">
<sqclass="underline" insert table="planets" xsclass="underline" extension-element-prefixes="sql">
<sqclass="underline" column name="Name" select="NAME"/>
<sqclass="underline" column name="Mass" select="MASS"/>
<sqclass="underline" column name="Radius" select="RADIUS"/>
<sqclass="underline" column name="Day" select="DAY"/>
</sqclass="underline" insert>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
В идеале этого должно быть достаточно, но при работе с самым последним драйвером Access в конце операции Saxon не сбрасывает все буфера данных. Это значит, что данные о последней планете в planets.xml, Земле, не будут отправлены в базу данных. Чтобы сбросить буферы данных, я явно вызываю шаблон <PLANET> как именованный шаблон, применяя <sqclass="underline" insert> с данными-заглушкой (листинг 10.11).
Листинг 10.11. Работа с реляционной базой данных<xsclass="underline" 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">
<xsclass="underline" param name="database" select="'jdbc:odbc:planets'"/>
<xsclass="underline" param name="user"/>
<xsclass="underline" param name="password"/>
<xsclass="underline" template match="PLANETS">
<sqclass="underline" connect database="{$database}" user="{$user}"
password="{$password}" driver="sun.jdbc.odbc.JdbcOdbcDriver"
xsclass="underline" extension-element-prefixes="sql"/>
<xsclass="underline" apply-templates select="PLANET"/>
<xsclass="underline" call-template name="writer"/>
</xsclass="underline" template>
<xsclass="underline" template match="PLANET" name="writer">
<xsclass="underline" choose>
<xsclass="underline" when test="NAME">
<sqclass="underline" insert table="planets"
xsclass="underline" extension-element-prefixes="sql">
<sqclass="underline" column name="Name" select="NAME"/>
<sqclass="underline" column name="Mass" select="MASS"/>
<sqclass="underline" column name="Radius" select="RADIUS"/>
<sqclass="underline" column name="Day" select="DAY"/>
</sqclass="underline" insert>
</xsclass="underline" when>
<xsclass="underline" otherwise>
<sqclass="underline" insert table="planets"
xsclass="underline" extension-element-prefixes="sql">
<sqclass="underline" column name="Name" select="' '"/>
<sqclass="underline" column name="Mass" select="' '"/>
<sqclass="underline" column name="Radius" select="' '"/>
<sqclass="underline" column name="Day" select="' '"/>
</sqclass="underline" insert>
</xsclass="underline" otherwise>
</xsclass="underline" choose>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Эта таблица стилей правильно добавляет три записи в базу данных planets.mdb: по одной новой записи для каждой из планет. Как я говорил, здесь нельзя использовать готовый исполняемый файл saxon.exe, нужно применять класс Java com.icl.saxon.StyleSheet. Сначала нужно включить в classpath файл saxon.jar: