Категории
Самые читаемые
RUSBOOK.SU » Компьютеры и Интернет » Интернет » XSLT - Стивен Холзнер

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

Читать онлайн XSLT - Стивен Холзнер

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 85 86 87 88 89 90 91 92 93 ... 115
Перейти на страницу:

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

1 ... 85 86 87 88 89 90 91 92 93 ... 115
Перейти на страницу:
На этой странице вы можете бесплатно скачать XSLT - Стивен Холзнер торрент бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Вася
Вася 24.11.2024 - 19:04
Прекрасное описание анального секса
Сергій
Сергій 25.01.2024 - 17:17
"Убийство миссис Спэнлоу" от Агаты Кристи – это великолепный детектив, который завораживает с первой страницы и держит в напряжении до последнего момента. Кристи, как всегда, мастерски строит