Стивен Холзнер - XSLT
import java.io.IOException;
import java.io.OutputStream;
import java.io.FileOutputStream;
import org.xml.sax.SAXException;
import com.sun.xml.tree.XmlDocument;
import com.jclark.xsl.dom.Transform;
import com.jclark.xsl.dom.Transform Engine;
import com.jclark.xsl.dom.TransformException;
import com.jclark.xsl.dom.XSLTransformEngine;
class xtjava {
public static void main(String[] args)
throws IOException, SAXException, TransformException {
XmlDocument XMLdoc =
new XmlDocument().createXmlDocument(args[0]);
XmlDocument XSLdoc =
new XmlDocument().createXmlDocument(args[1]);
XmlDocument newdoc = new XmlDocument();
XSLTransformEngine transformEngine = new XSLTransformEngine();
Transform transform = transformEngine.createTransform(XSLdoc);
transform.transform(XMLdoc, newdoc);
OutputStream out = new FileOutputStream(args[2]);
newdoc.write(out);
out.close();
}
}
Чтобы запустить пример, включите xt.jar и xml.jar в classpath:
C:>set classpath=.;d:xtxt.jar;xml.jar
Скомпилируйте теперь xtjava.java компилятором Java javac и запустите на выполнение следующим образом, передав URL документов XML и XSL (можно передать и URL файлов, как было показано ранее):
C:>java xtjava http://www.starpowder.com/planets.xml http://www.starpowder.com/planets.xsl planets.html
Теперь все сделано.
Преобразование XML в реляционную базу данных
При обсуждении дополнительных возможностей XSLT стоит упомянуть элементы расширения SQL процессора Saxon. Через драйвер Java Database Connectivity (JDBC) можно работать с реляционными базами данных. Мы уже рассмотрели преобразования из XML в XML, в простой текст, в RTF, в JavaScript и т.д. Теперь пришла очередь преобразованию XML в реляционную базу данных.
РАБОТА С ИНТЕРПРЕТИРУЕМЫМ SAXON
Обратите внимание: для связи с базами данных через JDBC нельзя использовать исполняемый файл для Windows saxon.exe. Нужно запустить реализующий Saxon класс Java com.id.saxon.StyleSheet, как я сделаю в конце примера.
В примере я передам данные planets.xml в базу данных формата Microsoft Access planets.mdb. Если вы хотите повторить пример, создайте этот файл базы данных, в нем — таблицу planets с четырьмя текстовыми полями Name, Mass, Radius и Day, а оставшуюся часть файла оставьте пустой. В Windows я зарегистрирую этот файл базы данных в качестве источника ODBC с именем «planets» через значок Data Sources (ODBC) (Источники данных (ODBC)) в панели управления (в Windows 2000 он расположен в панели управления в папке Administrative Tools (Администрирование)). При запуске пример считает данные планет из planets.xml и добавит их в файл базы данных, planets.mdb.
Для подключения к этой базе данных через 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).
Листинг 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:saxonsaxon.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-серверах и возвращающих результирующий документ браузеру пользователя.
Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Стивен Холзнер - XSLT, относящееся к жанру Интернет. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.


