Книга: XSLT

Преобразования из 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 из формата, используемого одной программой, в формат другой программы.

Оглавление книги


Генерация: 0.871. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз