=> Главная База Знаний Xslt Взаимодействие saxon с java


Взаимодействие saxon с java

Взаимодействие Saxon с Java

Процессор Saxon также определяет API для работы с Java, но, конечно, в деталях этот прикладной интерфейс отличается от API Xalan. Для демонстрации создания преобразований при помощи Saxon API версии 6.0.2 я создам новый класс Java

saxonjava
. Начать нужно с создания нового объекта
XSLTProcessor
, вызвав метод
newInstance
класса
Processor
в файле
saxonjava.java
:

import java.io.*;

import org.xml.sax.*;

import org.w3c.dom.*;

import com.icl.saxon.trax.*:


public class saxonjava {

 public static void main(String args[])

  throws ProcessorException, ProcessorFactoryException,

  TransformException, SAXException, IOException {

  Processor processor = Processor.newInstance("xslt");

  .

  .

  .

Затем необходимо создать объект

Templates
на основе таблицы стилей XSL, которую мы хотим применить, хранимой в
args[1]
. Это можно сделать при помощи класса
InputSource
:

import java.io.*;

.

.

.

public class saxonjava {

 public static void main(String args[])

  throws ProcessorException, ProcessorFactoryException,

  TransformException, SAXException, IOException {

  Processor processor = Processor.newInstance("xslt");

  Templates templates =

   processor.process(new InputSource(args[1]));

  .

  .

  .

 }

}

При помощи нового объекта

Templates
можно создать объект
Transformer
, который в действительности делает работу:

import java.io.*;

.

.

.

public class saxonjava {

 public static void main(String args[])

  throws ProcessorException, ProcessorFactoryException,

  TransformException, SAXException, IOException {

  Processor processor = Processor.newInstance("xslt");

  Templates templates =

   processor.process(new InputSource(args[1]));

  Transformer transformer = templates.newTransformer();

  .

  .

  .

 }

}

Наконец, чтобы осуществить XSLT-преобразование, нужно вызвать метод

transform
объекта
transformer
, записывая результат в выходной документ при помощи объекта
FileWriter
(листинг 10.8).

Листинг 10.8. saxonjava.java, взаимодействие Saxon с Java

import java.io.*;

import org.xml.sax.*;

import org.w3c.dom.*;

import com.icl.saxon.trax.*;


public class saxonjava {

 public static void main(String args[])

  throws ProcessorException, ProcessorFactoryException,

  TransformException, SAXException, IOException {

  Processor processor = Processor.newInstance("xslt");

  Templates templates =

   processor.process(new InputSource(args[1]));

  Transformer transformer = templates.newTransformer();

  transformer.transform(new InputSource(args[0]),

   new Result(new FileWriter(args[2])));

 }

}

Чтобы скомпилировать и использовать новый класс

saxonjava
, нужно установить
classpath
так, чтобы переменная включала путь к
saxon.jar
:

С:\>set сlasspath=.;с:\saxon\saxon.jar

Затем при помощи компилятора Java,

javac
, создается
saxonjava.class
.

Как и многие использующие API процессоры XSLT, Saxon ожидает, что ему будут переданы URL документов, с которыми вы хотите работать, — что я и делаю на следующем шаге:

C:\>java saxonjava http://www.starpowder.com/planets.xml http://www.starpowder.com/planets.xsl planets.html

Таким образом, создается

planets.html
, как и раньше. Заметьте, что если документы расположены локально, можно использовать URL файла. Например, в Windows, если документ XML расположен в
c:\XSL\saxonjava\planets.xml
, а документ XSL в
c:\XSL\saxonjava\planets.xsl
, можно выполнить такую командную строку:

C:\>java saxonjava file:///XSL/saxonjava/planets.xml file:///XSL/saxonjava/planets.xsl planets.html

ПРЕОБРАЗОВАНИЕ ИМЕН ФАЙЛОВ В URL

Если вам больше нравится писать в командной строке имена файлов, а не URL, имена можно преобразовывать в URL в коде. Для этого необходимо передать полный путь к файлу в класс Java URL, а путь можно получить методом getAbsolutePath класса File: File file = new File(filename); String fullpath = file.getAbsolutePath();.

В этом примере мы работали с Saxon версии 6.0.2, о котором на web-узле Saxon говорится как о вполне надежной версии, но на момент написания книги появилась новая, полностью не протестированная версия Saxon 6.2.2. (Не существовало версии Saxon 6.1.x.) В последней версии Saxon, кажется, собирается вернуться к той же модели API, которую использует Xalan, и код, работоспособный в версии 6.0.2, не будет работать в версии 6.2.2 (сюрприз!). Ниже приведен код

saxonjava.java
для версии 6.2.2 — проверьте, что при работе с этим кодом вы включили в
classpath
новую версию
saxon.jar
, и обратите внимание на то, что при его выполнении вам нужно передавать не URL файлов, а только их имена. Этот код идентичен показанному ранее
xalanjava.java
, за исключением имени класса,
saxonjava
:

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.stream.StreamSource;

import javax.xml.transform.stream.StreamResult;

import javax.xml.transform.TransformerException;

import javax.xml.transform.TransformerConfigurationException;

import java.io.FileOutputStream;

import java.io.FileNotFoundException;

import java.io.IOException;


public class saxonjava {

 public static void main(String[] args)

  throws TransformerException, TransformerConfigurationException,

  FileNotFoundException, IOException {

  TransformerFactory tFactory = TransformerFactory.newInstance();

  Transformer transformer =

   tFactory.newTransformer(new StreamSource(args[1]));

  transformer transform(new StreamSource(args[0]),

   new StreamResult(new FileOutputStream(args[2])));

 }

}