Чтение онлайн

ЖАНРЫ

Холзнер Стивен

Шрифт:

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:\saxon\saxon.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-серверах и возвращающих результирующий документ браузеру пользователя.

Поделиться с друзьями: