newdoc.print(out);
out.close();
} catch (Exception e) {}
}
}
На этом oraclejava.java заканчивается. Чтобы скомпилировать пример, включите в classpath путь к разборщику XML процессора XSLT Oracle, xmlparserv2.jar:
C:\>set classpath=.;c:\oraclexml\lib\xmlparserv2.jar
Затем скомпилируйте oraclejava.java, как мы это уже делали, компилятором Java javac. Для выполнения XSLT-преобразований нужно указать URL документов, с которыми вы хотите работать (если документы локальны, можно указать URL файлов, как и раньше):
C:\>java oraclejava http://starpowder.com/planets.xml http://starpowder.com/planets.xsl planets.html
Взаимодействие XT с Java
Процессор XT также может работать с Java. API XT спроектирован для работы с классами, определенными в Project X TR2 фирмы Sun, которые поддерживают обработку XML. Вам будет необходим файл xml.jar фирмы Sun, который можно получить, загрузив Project X TR2. Чтобы получить xml.jar, необходимо зарегистрироваться на web-узле разработчиков Sun, http://developer.java.sun.com, что, к счастью, бесплатно, хотя и потребует от вас заполнения изрядного количества форм.
Файл xml.jar нужен для класса com.sun.xml.tree.XmlDocument. Этот класс поддерживает XML-документы, и я начну свой новый пример, xtjava.java, с создания нового объекта XmlDocument для исходного документа, таблицы стилей 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.TransformEngine;
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();
.
.
.
После этого я создаю объект XSLTranformationEngine и вызываю его метод createTransform для создания нового объекта Transform на основе таблицы стилей XSLT:
import java.io.IOException;
.
.
.
class xtjava {
public static void main(String[] args)
throws IOException, SAXException, TransformException {
XmlDocument doc = new XmlDocument();
XSLTransformEngine transformEngine = new XSLTransformEngine();
Transform transform = transformEngine.createTransform(XSLdoc);
.
.
.
Затем я могу преобразовать XML-документ в объект результирующего документа следующим способом:
import java.io.IOException;
.
.
.
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);
.
.
.
Так завершается преобразование. Осталось только записать результирующий документ, newdoc, на диск, что можно сделать при помощи объекта FileOutputStream (листинг 10.10).
Листинг 10.10. xtjava.java, взаимодействие XT с Javaimport 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:\xt\xt.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.