XSLT — страница 87 из 124

, как и раньше. Заметьте, что если документы расположены локально, можно использовать 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])));

 }

}

Взаимодействие процессора XSLT Oracle с Java

Несколько больше усилий потребуется для осуществления XSLT-преобразования при помощи API процессора XSLT фирмы Oracle. Новый пример,

oraclejava.java
, продемонстрирует работу с этим API.

В

oraclejava.java
в первую очередь необходимо считывать требуемые документы при помощи объекта
DOMParser
:

import org.w3c.dom.*;

import java.util.*;

import java.io.*;

import java.net.*;

import oracle.xml.parser.v2.*;


public class oraclejava {

 public static void main (String args[]) throws Exception {

  DOMParser parser;

  try {

   parser = new DOMParser();

   parser.setPreserveWhitespace(true);

   .

   .

   .

Затем, чтобы считать исходный документ XML и документ таблицы стилей XSLT, нужно преобразовать их URL в объекты

URLJava
при помощи метода
parse
объекта
parser
. После этого я вызываю метод разборщика
getDocument
, для того чтобы извлечь и сохранить документы XML и XSLT в объектах
XMLDocument
:

public class oraclejava {

 public static void main (String args[]) throws Exception {

  DOMParser parser;

  XMLDocument xmldoc, xsldoc;

  URL xslURL;

  URL xmlURL;

  try {

   parser = new DOMParser();

   parser.setPreserveWhitespace(true);

   xmlURL = new URL(args[0]);

   parser.parse(xmlURL);

   xmldoc = parser.getDocument();

   xslURL = new URL(args[1]);

   parser.parse(xslURL);

   xsldoc = parser.getDocument();

   .

   .

   .

В этот момент

planets.xml
и
planets.xsl
заключены в объекты
XMLDocument
. Для выполнения преобразования мне необходимы еще объекты
XSLStylesheet
и
XSLProcessor
для таблицы стилей XSLT. Фактическое преобразование XSLT осуществляется методом
processXSL
объекта
parser
, возвращающего фрагмент документа:

public class oraclejava {

 public static void main (String args[]) throws Exception {

  DOMParser parser;

  .

  .

  .

  xslURL = new URL(args[1]);

  parser.parse(xslURL);

  xsldoc = parser.getDocument();

  XSLStylesheet xslstylesheet = new XSLStylesheet(xsldoc, xslURL);

  XSLProcessor processor = new XSLProcessor();

  DocumentFragment docfragment =

   processor.processXSL(xslstylesheet, xmldoc);

  .

  .

  .

Этот код завершает преобразование. Теперь задача состоит в том, чтобы преобразовать данный фрагмент документа в документ XML, который можно записать на диск, — для чего я и создам новый XML-документ,

newdoc
, и вставлю фрагмент документа в корень нового документа:

import org.w3c.dom.*;

.

.

.

public class oraclejava {

 public static void main (String args[]) throws Exception {

  DOMParser parser;

  XMLDocument xmldoc, xsldoc, newdoc;

  URL xslURL;

  URL xmlURL;

  try {

   .

   .

   .

   DocumentFragment docfragment =

    processor processXSL(xslstylesheet, xmldoc);

   newdoc = new XMLDocument();

   Element rootElement = newdoc.createElement("root");

   newdoc.appendChild(rootElement);

   rootElement.appendChild(docfragment);

   .

   .

   .

Теперь осталось только сохранить на диске новый XML-документ с именем, заданным в