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, поэтому я использую элемент <xsl:output>
, атрибут method
которого установлен в «xml» (фактически тип выходных данных обычно и есть XML, но если процессор XSLT видит тег <html>
, он обычно по умолчанию генерирует HTML).
<?xml version='1.0'?>
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:strip-space elements='*'/>
<xsl:output method='xml' indent='yes'/>
<xsl:template match='/'>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match='PLANETS'>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match='PLANET'>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match='MASS'>
<xsl:copy>
<xsl:value-of select='.'/>
<xsl:value-of select='@UNITS'/>
</xsl:copy>
</xsl:template>