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

• mod_xslt, http://modxslt.userworld.com. Простой модуль web-сервера Apache, использующий XSLT для получения содержимого XML. Для обработки XSLT используется процессор Sablotron;

• PXSLServlet, www.pault.com/Pxsl При помощи этого сервлета можно преобразовать XML в HTML с использованием XSLT. Он также позволяет читать и записывать данные в базу данных на основе SQL (через JDBC);

• xesalt, www.inlogix.de/products.html. Этот процессор XSLT существует в виде модуля для web-серверов Apache и IIS;

• XML Enabler, www.alphaworks.ibm.com/tech/xmlenabler. XML Enabler позволяет отправлять запросы сервлету, а при ответе сервлета XML Enabler может отформатировать данные при помощи различных таблиц стилей XSLT;

• XT, может быть использован как сервлет Java. Ему требуется сервлет-машина (servlet engine), реализующая, по крайней мере, версию 2.1 Java Servlet API. Класс-сервлет Java называется com.jclark.xsi.sax.XSLServlet.

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

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

 contentType="text/html" import="org.apache.xalan.xslt.*:java.io.*" %>

<%

 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();

%>

Результат можно увидеть на рис. 1.4: там изображен файл planets.html, отправленный в Internet Explorer web-сервером, на котором выполняется JSP. В главе 10 приведена дополнительная информация об использовании сервлетов Java, JSP и ASP для XSLT-преобразований на стороне сервера.

Рис. 1.4. Преобразование XML на web-сервере 

Мы рассмотрели, как выполнить XSLT-преобразования при помощи отдельных процессоров XSLT в браузере Internet Explorer и на web-серверах. Однако единственное преобразование, которое мы до сих пор сделали, — это преобразование XML в HTML. Хотя сейчас это наиболее популярное преобразование, преобразования из XML в XML также становятся все более распространенными. 

Преобразования из XML в XML

Преобразования XML-XML иногда рассматриваются как SQL для Интернета, поскольку они позволяют оперировать запросами к базе данных в XML-документах. Ниже приведен пример. Используемый нами файл planets.xml содержит достаточно много данных о каждой планете:

<?xml version="1.0"?>

 <PLANETS>

  <PLANET>

   <NAME>Mercury</NAME>

   <MASS UNITS="(Earth = 1)">.0553</MASS>

   <DAY UNITS="days">58.65</DAY>

   <RADIUS UNITS="miles">1516</RADIUS>

   <DENSITY UNITS="(Earth = 1)">.983</DENSITY>

   <DISTANCE UNITS="million miles">43.4</DISTANCE><!--B перигелии-->

  </PLANET>

  <PLANET>

   <NAME>Venus</NAME>

   <MASS UNITS="(Earth = 1)">.815</MASS>

   <DAY UNITS="days">116.75</DAY>

   <RADIUS UNITS="miles">3716</RADIUS>

   <DENSITY UNITS="(Earth = 1)">.943</DENSITY>

   <DISTANCE UNITS="million miles">66.8</DISTANCE><!--B перигелии-->

  </PLANET>

  .

  .

  .

Что, если нам нужно только подмножество этих данных — например, имя и масса каждой планеты? В терминах баз данных planets.xml представляет собой таблицу, и мы хотим создать новую таблицу, содержащую подмножество данных из первой. В базах данных для этого служит язык SQL, а для документов XML мы можем использовать XSLT.

В листинге 1.6 приведена новая версия файла planets.xsl, осуществляющая требуемое преобразование: выбираются только имя и масса каждой планеты, которые отправляются в выходной документ. В особенности обратите внимание на то, что мы осуществляем преобразование XML-XML, поэтому я использую элемент <xsclass="underline" output>, атрибут method которого установлен в «xml» (фактически тип выходных данных обычно и есть XML, но если процессор XSLT видит тег <html>, он обычно по умолчанию генерирует HTML).

Листинг 1.6. Выбор только имени и массы

<?xml version="1.0"?>

<xsclass="underline" stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsclass="underline" strip-space elements="*"/>

 <xsclass="underline" output method="xml" indent="yes"/>

 <xsclass="underline" template match="/">

  <xsclass="underline" apply-templates/>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANETS">

  <xsclass="underline" apply-templates/>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET">

  <xsclass="underline" copy>

   <xsclass="underline" apply-templates/>

  </xsclass="underline" copy>

 </xsclass="underline" template>

 <xsclass="underline" template match="MASS">

  <xsclass="underline" copy>

   <xsclass="underline" value-of select="."/>

   <xsclass="underline" value-of select="@UNITS"/>

  </xsclass="underline" copy>

 </xsclass="underline" template>

 <xsclass="underline" template match="RADIUS"> </xsclass="underline" template>

 <xsclass="underline" template match="DAY"> </xsclass="underline" template>