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