Выбрать главу

  Response.End

 End If

 .

 .

 .

ОТДЕЛЕНИЕ ДАННЫХ ОТ ИХ ПРЕДСТАВЛЕНИЯ

Одной из преобладающих тенденций в последнее время является стремление отделить данные от представляющего их кода. Рассмотренный пример демонстрирует преимущества такого подхода: единственный набор данных можно преобразовывать в рабочем порядке для различных браузеров.

Применение XSLT с Java Server Pages

Для работы с активными серверными страницами я использовал процессор MSXML фирмы Microsoft, но серверные страницы Java (Java Server Pages, JSP) не обязаны выполняться на серверах на платформе Windows, поэтому с JSP я не использую MSXML. Для выполнения XSLT-преобразования и отправки результатов в браузер клиента я воспользуюсь API процессора Xalan для работы с Java.

Например, при помощи Xalan можно создать planets.html на сервере как временный документ (этот код предполагает, что planets.xml и planets.xsl расположены в том же каталоге, что и сценарий JSP) таким образом:

<%@ page errorPage="error.jsp" language="java"

 contentType="text/html" import="org.apache.xalan.xslt.*;java.iо.*" %>

<%

 try {

  XSLTProcessor processor = XSLTProcessorFactory.getProcessor();

  processor.process(new XSLTInputSource("planets.xml"),

   new XSLTInputSource("planets.xsl"),

   new XSLTResultTarget("planets.html"));

 } catch(Exception e) {}

 .

 .

 .

Теперь все, что нужно сделать, — это открыть документ и отправить его обратно клиенту (листинг 10.13).

Листинг 10.13. XSLT на сервере с применением JSP

<%@ page errorPage="error.jsp" language="java"

 contentType="text/html" import="org.apache.xalan.xslt.*;java.iо.*" %>

<%

 try {

  XSLTProcessor processor = XSLTProcessorFactory.getProcessor();

  processor.process(new XSLTInputSource("planets.xml"),

   new XSLTInputSource("planets.xsl"),

   new XSLTResultTarget("planets.html"));

 } catch(Exception e) {}

 FileReader filereader = new FileReader("planets.html");

 BufferedReader bufferedreader = new BufferedReader(filereader);

 String instring;

 while((instring = bufferedreader.readLine()) != null) { %>

  <%= instring %>

 <% } 

 filereader.close();

 pw.close();

%>

Теперь все готово. Результаты применения этого сценария JSP показаны на рис. 10.6.

Рис. 10.6. Применение XSLT с JSP

Применение XSLT с сервлетами Java

Выполнять XSLT-преобразования на сервере можно также при помощи сервлетов (servlet) Java. Хотя многие процессоры XSLT предоставляют свои собственные версии сервлетов, я считаю, что гораздо проще самостоятельно выполнить преобразование при помощи Xalan или другого процессора XSLT и затем обработать результирующий документ и отправить его обратно клиенту.

В следующем примере я при помощи Xalan преобразую planets.xml во временный файл planets.html, применяя planets.xsl в сервлете:

import java.net.*;

import java.sql.*;

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import javax.servlet.*;

import org.apache.xalan.xslt.*;

public class xslservlet extends GenericServlet {

 public void service(ServletRequest request, ServletResponse response)

  throws ServletException, IOException {

  try {

   XSLTProcessor processor = XSLTProcessorFactory.getProcessor();

   processor.process(new XSLTInputSource("planets.xml"),

    new XSLTInputSource("planets.xsl"),

    new XSLTResultTarget("planets.html"));

  } catch(Exception e) {}

  .

  .

  .

Все, что осталось, — отправить HTML-документ обратно клиенту (листинг 10.14).

Листинг 10.14. Применение XSLT на сервере с сервлетами Java

import java.net.*;

import java.sql.*;

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import javax.servlet.*;

import org.apache.xalan.xslt.*;

public class xslservlet extends GenericServlet {

 public void service(ServletRequest request, ServletResponse response)

  throws ServletException.IOException {

  response.setContentType("text/html");

  PrintWriter pw = response.getWriter();

  try {

   XSLTProcessor processor = XSLTProcessorFactory.getProcessor();

   processor.process(new XSLTInputSource("planets.xml"),

    new XSLTInputSource("planets.xsl"),

    new XSLTResultTarget("planets.html"));

  } catch(Exception e) {}

  FileReader filereader = new FileReader("planets.html");

  BufferedReader bufferedreader = new BufferedReader(filereader);

  String instring;

  while((instring = bufferedreader.readLine()) != null) {

   pw.println(instring);

  }

  filereader.close();

  pw.close();

 }

}

Теперь все сделано, результат показан на рис. 10.7 — HTML-документ, переданный из сервлета.

Рис. 10.7. Применение XSLT с сервлетами Java

На этом мы заканчиваем изучение работы с API процессоров XSLT в программном коде. Мы рассмотрели весьма объемный материал: как взаимодействовать с API процессоров XSLT из JavaScript и Java для процессоров MSXML, Xalan, XT, Saxon и Oracle, а также примеры выполнения XSLT-преобразований на web-серверах при помощи ASP, JSP и сервлетов Java.

Глава 11 Применение XSLT для создания документов XSL-FO

Мы уже рассмотрели XSLT-преобразования из XML в XML, HTML, XHTML, RTF, простой текст, JavaScript и даже в реляционные базы данных. В этой и следующей главах вы познакомитесь с новым преобразованием, для которого и создавались XSLT: преобразование XML в документы, которые используют форматирующие объекты, XSL (документы XSL-FO).