Главная » XSLT » Работа с XSLT в программах на языке Java

0

Задача

Требуется выполнить XSLT-преобразование в приложении, написанном на Java.

Решение

Обратиться к XSLT из программы на Java можно тремя способами:

?               воспользоваться интерфейсом, который предлагает ваш любимый XSLT- процессор, написанный на Java;

?               воспользоваться более переносимым интерфейсом TrAX API;

?               воспользоваться пакетом JAXP 1.2 или 1.3 (надмножество TrAX, см. http:// java.sun.com/xml/jaxp/index.jsp).

Если вы хорошо знакомы с внутренним устройством какой-нибудь конкретной Java-реализации XSLT, то возникает искушение воспользоваться предоставляемым API напрямую. Но лучше этого не делать, потому что код получится непере­носимым.

Альтернативу предлагает Transformation API for XML (TrAX) – проект, кото­рый был начат по инициативе организации Apache.org (http://xml.apache.org/ xalan-j/trax.html). Идеология, положенная в основу TrAX, лучше всего описана на сайте проекта, поэтому просто приведем цитату:

Сообщество пользователей Java выиграло бы от наличия единого API, по­зволяющего работать в рамках одной модели, писать код в соответствии со стандартизованными интерфейсами и применять преобразования полимор­фно. Проект TrAX – это попытка определить ясную и обобщенную модель, которая в то же время удовлетворяла бы требованиям широкого спектра при­ложений.

Проект TrAX вошел составной частью в спецификацию JAXP 1.1 (а затем и версий 1.2 и 1.3 для J2SE 5.0), поэтому теперь есть только два способа организо­вать интерфейс Java и XSLT: переносимый и непереносимый. Но на вопрос, какой способ выбрать, нет однозначного ответа. У каждого процессора есть уникальные особенности, которые иногда бывают необходимы, поэтому если переносимость не имеет решающего значения, то можно и воспользоваться тем средством, которое лучше отвечает стоящей задаче. Тем не менее, в этом разделе мы будем рассматри­вать только переносимый JAXP 1.2 API.

С помощью JAXP 1.1 можно написать простой командный процессор XSLT, как показывает следующий пример, заимствованный из книги Eric M. Burke Java and XSLT (O’Reilly, 2001):

public class Transform

{

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

if (args.length != 2) {

System.err.println(

"Usage: java Transform [xmlfile] [xsltfile]");

System.exit(1); }

// Открыть входной файл и таблицу стилей File xmlFile = new File(args[0]); File xsltFile = new File(args[1]);

// Для чтения данных в JAXP используется интерфейс Source Source xmlSource = new StreamSource(xmlFile); Source xsltSource = new StreamSource(xsltFile);

// Фабричные классы позволяют скрыть конкретный процессор XSLT // от приложения, так как возвращают стандартный интерфейс // Transformer

TransformerFactory transFact =

TransformerFactory.newInstance( ); Transformer trans = transFact.newTransformer(xsltSource);

// Применить таблицу стилей к входному документу trans.transform(xmlSource, new StreamResult(System.out));

}

}

Помимо StreamResult, есть еще класс DOMResult, позволяющий получить ре­зультат в виде дерева DOM для последующей обработки, а также класс SAXResult, который дает возможность обрабатывать результаты в событийно-ориентирован­ном стиле.

В случае DOM результат возвращается в виде объектов Document, DocumentFragment или Element в зависимости от типа узла, переданного конструктору DOMResult.

В случае SAXResult конструктору передается созданный пользователем объект типа ContentHandler, который и получает события SAX. Напомним, что SAX-обработчик определяет обратные вызовы для событий startDocument(), startElement(), characters(), endElement() и endDocument(). Допол­нительную информацию о SAX см. сайт http://www.saxproject.org/.

Обсуждение

Возможность получить доступ к XSLT-преобразованиям из Java хороша не тем, что вы можете написать собственный командный интерфейс к процессору XSLT, а тем, что и без того богатейшая библиотека классов Java теперь включает и это средство.

Рассмотрим написанный на Java серверный процесс, который должен обраба­тывать постоянно изменяющиеся XML-документы, хранящиеся в базе данных, или поступающие в виде SOAP-сообщений. Быть может, для обеспечения обрат­ной совместимости сервер должен поддерживать несколько вариантов схемы до­кумента или несколько версий SOAP-клиента. При этом обработка разных схем должна производиться прозрачно. Насколько проще был бы код сервера, если бы старую схему можно было на лету преобразовать в новую.

Приятной особенностью JAXP является тот факт, что экземпляры объектов- преобразователей можно использовать повторно, поэтому откомпилировать таб­лицу стилей необходимо только один раз, в момент загрузки сервера. Правда, если сервер многопоточный, и преобразования могут выполняться в каждом потоке, то для обеспечения безопасности относительно потоков придется создать несколько объектов.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии