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

 </xsclass="underline" when>

 <xsclass="underline" otherwise>

  <xsclass="underline" text>Sorry, can't do math today.</xsclass="underline" text>

 </xsclass="underline" otherwise>

</xsclass="underline" choose>

Есть еще один способ обработать случай отсутствия элемента расширения — элемент <xsclass="underline" fallback>.

Элемент <xsclass="underline" fallback>

При помощи элемента XSLT 1.0 <xsclass="underline" fallback> можно указать, что следует делать в случае отсутствия элемента расширения. Этот элемент заключается в элемент расширения и используется в случае его недоступности.

У элемента <xsclass="underline" fallback> нет атрибутов, он содержит тело шаблона.

В следующем примере я создам элемент <xsclass="underline" fallback> внутри элемента <redirect:write> из предыдущего примера. В случае отсутствия элемента <redirect:write> элемент <xsclass="underline" fallback> прекратит обработку и выдаст сообщение:

<xsclass="underline" stylesheet

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

 version="1.0"

 xmlns:lxslt="http://xml.apache.org/xslt"

 xmlns:redirect="org.apache.xalan.lib.Redirect"

 extension-element-prefixes="redirect">

 <lxslt:component prefix="redirect" elements="write open close" functions="">

  <lxslt:script lang="javaclass" src="org.apache.xalan.lib.Redirect"/>

 </lxslt:component>

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

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

  <xsclass="underline" apply-templates/>

 </xsclass="underline" template>

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

  <redirect:write select="@file">

   <PLANETS>

    <xsclass="underline" apply-templates/>

   </PLANETS>

   <xsclass="underline" fallback>

    <xsclass="underline" message terminate="yes">

     <xsclass="underline" text>Could not create multiple output documents.</xsclass="underline" text>

    </xsclass="underline" message>

   </xsclass="underline" fallback>

  </redirect:write>

 </xsclass="underline" template>

 <xsclass="underline" template match="@*|node()">

  <xsclass="underline" copy>

   <xsclass="underline" apply-templates select="@*|node()"/>

  </xsclass="underline" copy>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

На этом мы заканчиваем введение в работу с данными в документах XML. В следующей главе мы разберем эту тему и узнаем, как изменять содержимое документа и создавать новые элементы, атрибуты и инструкции обработки.

Глава 6 Преобразование в XML, HTML, XHTML, RTF

Предположим, web-узел вашей компании использует основанное на XML программное обеспечение фирмы Commerce One, в котором для безопасной коммуникации через Интернет применяется Java Message Service (JMS). Ваша деятельность была настолько успешной, что вы только что поглотили своего конкурента. К сожалению, для своего узла в Интернете ваш бывший конкурент использует другой основанный на XML продукт, RosettaNet. Как вам теперь преобразовать заказ на покупку xCBL Commerce One, написанный на XML, в заказ на покупку RosettaNet, также написанный на XML, но совершенно на другом диалекте?

Разумеется, применить XSLT. Такого рода XML-XML преобразования становятся все более и более распространенными. Все больше компаний применяют JMS для безопасных коммуникаций через Интернет, и поскольку JMS выполняется в Java, будет разумным связать JMS с основанными на Java процессорами XSLT, такими, как Xalan или Saxon.

В этой книге мы уже рассматривали преобразование XML в HTML, XML и простой текст, но в текущей главе сделаем это более подробно. Мы также рассмотрим здесь новый тип преобразования — из XML в JavaScript. В главе 10 мы познакомимся с преобразованиями из XML в базу данных на основе SQL, а в главе 11 — с преобразованиями из XML в XSL-FO.

Основная задача XSLT состоит не просто в замене одного элемента на другой, но в полной реорганизации содержимого XML-документа. Например, вам может потребоваться реорганизовать planets.xml в терминах плотности планет при помощи XSLT для создания нового XML-документа:

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

<DATA>

 <DENSITY>

  <VALUE>.983</VALUE>

  <NAME>Mercury</NAME>

  <MASS>.0553</MASS>

  <DAY>58.65</DAY>

  <RADIUS>1516</RADIUS>

 </DENSITY>

 <DENSITY>

  <VALUE>.943</VALUE>

  <NAME>Venus</NAME>

  <MASS>.815</MASS>

  <DAY>116.75</DAY>

  <RADIUS>3716</RADIUS>

 </DENSITY>

 <DENSITY>

  <VALUE>1</VALUE>

  <NAME>Earth</NAME>

  <MASS>1</MASS>

  <DAY>1</DAY>

  <RADIUS>2107</RADIUS>

 </DENSITY>

</DATA>

Мы рассмотрим преобразование, которое полностью меняет содержимое planets.xml, оставляя только небольшой код HTML и код JavaScript для отображения нескольких кнопок в браузере.

До сих пор мы создавали новые элементы только при помощи элементов буквального результата, то есть рассматривая новые элементы как текст и встраивая их в таблицу стилей. Но, как мы увидим в этой главе, не всегда возможно знать имена создаваемых новых элементов. Можно состыковать вместе создаваемые элементы по ходу дела, рассматривая их как сырой текст, но это явная недоработка, поскольку разметка трактуется как текст. В этой главе мы начнем применять элементы XSLT <xsclass="underline" element>, <xsclass="underline" attribute>, <xsclass="underline" processing-instruction> и <xsclass="underline" comment> для создания новых элементов, атрибутов, инструкций обработки и комментариев на этапе выполнения. Хорошее знание этих элементов необходимо при реорганизации содержимого XML.