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).

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

<?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>

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату