Выбрать главу

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