Рейтинговые книги
Читем онлайн XSLT - Стивен Холзнер

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 5 6 7 8 9 10 11 12 13 ... 115

 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>

 <xsl:template match="RADIUS"> </xsl:template>

 <xsl:template match="DAY"> </xsl:template>

 <xsl:template match="DENSITY"> </xsl:template>

 <xsl:template match="DISTANCE"> </xsl:template>

</xsl:stylesheet>

Далее я применяю эту новую версию planets.xsl к planets.xml, используя Xalan, чтобы создать новый документ XML, new.xml:

C:planets>java org.apache.xalan.xslt.Process -IN planets.xml -XSL planets.xsl -OUT new.xml

Вот как выглядит результирующий документ XML, new.xml:

<?xml version="1.0" encoding="UTF-8"?>

<PLANET>

 <NAME>Mercury</NAME>

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

</PLANET>

<PLANET>

 <NAME>Venus</NAME>

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

</PLANET>

<PLANET>

 <NAME>Earth</NAME>

 <MASS>1(Earth = 1)</MASS>

</PLANET>

Отметьте, что этот файл выглядит во многом похоже на исходный файл planets.xml, за тем исключением, что каждый элемент <PLANET> содержит только элементы <NAME> и <MASS>. Таким образом, мы смогли получить подмножество данных первоначального документа XML.

Конечно, можно проводить любое число такого рода преобразований XML-XML. Можно обрабатывать данные в документе XML для создания совершенно новых XML-документов. Например, можно взять XML-документ с именами студентов и их отметками и создать новый документ, отображающий средние оценки. В XSLT есть много встроенных функций, позволяющих работать с данными подобным образом, — мы познакомимся с ними в главе 8.

В дополнение следует сказать, что многие программы используют XML для обмена данными в Интернете, и, так как обычно они форматируют свои документы XML по-разному, еще одним популярным способом использования преобразований XML-XML в Интернете является преобразование XML из формата, используемого одной программой, в формат другой программы.

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

Хотя во многих книгах рассматриваются исключительно преобразования из XML в HTML, правда состоит в том, что консорциум W3C этому не очень-то рад. Консорциум пытался сместить акцент с HTML (который они первоначально стандартизировали) на свою новую спецификацию, XHTML, представляющую собой совместимую с XML переработку HTML. Документы XHTML являются также хорошо сформированными допустимыми документами XML, поэтому преобразование из XML в XHTML в действительности есть преобразование из XML в специальный вид XML.

Хотя W3C активно продвигает XHTML, этот формат еще не стал широко распространенным. Поэтому в данной книге я в основном рассматриваю HTML; но поскольку W3C утверждает, что следует использовать XHTML, я кратко рассмотрю эту тему здесь и в главе 6. Если вы хотите узнать больше о XHTML, прочитайте рекомендацию W3C XHTML 1.0 по адресу www.w3.org/TR/xhtml1/, а также рекомендацию XHTML 1.1 по адресу www.w3.org/TR/xhtml11/.

Пусть W3C и утверждает, что XML следует преобразовывать в XHTML, а не в HTML, я не видел ни одного работающего примера на их web-узле. Представленные ими примеры на самом деле не генерируют допустимых документов XHTML. Тем не менее, поддержка преобразований XML-XHTML предположительно будет встроена в XSLT 2.0, и желаемое W3C явление, вероятно, нас вскоре ждет.

Более подробно мы рассмотрим этот тип преобразования в главе 6, а здесь я приведу рабочую версию таблицы planets.xsl, которая создает допустимую XHTML-версию planets.html (листинг 1.7). Заметьте, что на этот раз в элементе <xsl:output> нужно использовать атрибут doctype-public, и хотя это корректный код XSLT, не все процессоры XSLT смогут его обработать.

Листинг 1.7. Преобразование XML-XHTML

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:output method="xml"

  doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

  doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" indent="yes"/>

 <xsl:template match="/PLANETS">

  <html>

   <head>

    <title>

     The Planets Table

    </title>

   </head>

   <body>

    <h1>

     The Planets Table

    </h1>

    <table>

     <tr>

      <td>Name</td>

      <td>Mass</td>

      <td>Radius</td>

      <td>Day</td>

     </tr>

     <xsl:apply-templates/>

    </table>

   </body>

  </html>

 </xsl:template>

 <xsl:template match="PLANET">

  <tr>

   <td><xsl:value-of select="NAME"/></td>

   <td><xsl:apply-templates select="MASS"/></td>

   <td><xsl:apply-templates select="RADIUS"/></td>

   <td><xsl:apply-templates select="DAY"/></td>

  </tr>

 </xsl:template>

 <xsl:template match="MASS">

  <xsl:value-of select="."/>

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>

 <xsl:template match="RADIUS">

  <xsl:value-of select="."/>

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>

 <xsl:template match="DAY">

  <xsl:value-of select="."/>

  <xsl:text> </xsl:text>

1 ... 5 6 7 8 9 10 11 12 13 ... 115
На этой странице вы можете бесплатно читать книгу XSLT - Стивен Холзнер бесплатно.

Оставить комментарий