KnigaRead.com/

Стивен Холзнер - XSLT

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Стивен Холзнер, "XSLT" бесплатно, без регистрации.
Перейти на страницу:

 </xsl:template>

</xsl:stylesheet>

Вот результат:

<HTML>

 <HEAD>

  <TITLE>

   Planets

  </TITLE>

 </HEAD>

 <BODY>

  <!--This was the Mercury element-->

  <!--This was the Venus element-->

  <!--This was the Earth element-->

 </BODY>

</HTML>

Элемент <xsl:processing-instruction>: создание инструкций обработки

При помощи элемента <xsl:processing-instruction> можно создавать новые инструкции обработки. У этого элемента один атрибут:

• name (обязательный). Задает имя инструкции обработки. Принимает значение шаблона значений атрибута, возвращающего NCName.

В следующем примере я удалил инструкцию <?xml-stylesheet?> из начала 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>

 .

 .

 .

Для того чтобы снова добавить эту инструкцию обработки, можно применить элемент <xsl:processing-instruction> (листинг 6.9). Пункты type и href в инструкции обработки, например <?xml-stylesheettype="text/xml" href="planets.xsl"?>, в действительности не являются атрибутами, поэтому их значения нужно устанавливать не при помощи <xsl:attribute>, а используя простой текст.

Листинг 6.9. Применение <xsl:processing-instruction>

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:output method="xml"/>

 <xsl:template match="/">

  <xsl:processing-instruction name="xml-stylesheet">

   <xsl:text>type="text/xml" href="planets.xsl"</xsl:text>

  </xsl:processing-instruction>

  <xsl:apply-templates/>

 </xsl:template>


 <xsl:template match="@*|node()">

  <xsl:copy>

   <xsl:apply-templates select="@*|node()"/>

  </xsl:copy>

 </xsl:template>

</xsl:stylesheet>

Вот результат, где инструкция обработки <?xml-stylesheet?> снова на месте:

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

<?xml-stylesheet type="text/xml" href="planets.xsl"?>

<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><!--At perihelion-->

 </PLANET>

 .

 .

 .

Элемент <xsl:document>: создание нескольких выходных документов

В рабочем проекте XSLT 1.1 был представлен новым элемент, <xsl:document>, предназначенный для поддержки нескольких выходных документов, — и, скорее всего, этот элемент будет добавлен в XSLT 2.0. Он имеет следующие атрибуты:

• href (обязательный). Указывает место, в которое должен быть помещен новый документ. Устанавливается в абсолютный или относительный URI, без идентификатора фрагмента;

• method (необязательный). Устанавливает метод вывода, используемый для создания результирующего документа. Устанавливается в «xml», «html», «text» или QName, которое не является NCName;

• version (необязательный). Задает версию выходного документа. Устанавливается в NMTOKEN;

• encoding (необязательный). Задает кодировку выходного документа. Устанавливается в строку; 

• omit-xml-declaration (необязательный). Принимает значения «yes» или «no» для того, чтобы пропускать или не пропускать объявление XML;

• cdata-section-elements (необязательный). Определяет имена тех элементов, чье содержимое вы хотите вывести как разделы CDATA. Принимает значение разделенного символами-разделителями списка QName;

• doctype-public (необязательный). Определяет открытый идентификатор, который будет использован в объявлении <!DOCTYPE> вывода. Устанавливается в строковое значение;

• doctype-system (необязательный). Определяет системный идентификатор, который будет использован в объявлении <!DOCTYPE> вывода. Устанавливается в строковое значение;

• encoding (необязательный). Задает кодировку символов. Устанавливается в строковое значение;

• indent (необязательный). Определяет выравнивание вывода для отображения структуры вложенности. Устанавливается в «yes» или «no»;

• media-type (необязательный). Задает тип MIME вывода. Устанавливается в строковое значение;

• standalone (необязательный). Определяет, нужно ли включать в вывод отдельное объявление, и если да, задает его значение. Устанавливается в «yes» или «no».

Этот элемент содержит тело шаблона.

В следующем примере, основанном на упрощенной таблице стилей, я создаю в документе HTML две рамки (frame), и два HTML-документа, которые будут в них отображаться, frame1.html и frame2.html. Первую рамку и документ, который в ней появится, frame1.html, я создам при помощи <xsl:document> следующим образом (заметьте, что здесь я устанавливаю атрибут version в «1.1», поскольку мы используем возможность, входящую только в рабочий проект XSLT 1.1, но «1.1», вероятно, не будет правильным значением атрибута version в долгосрочном периоде; если элемент <xsl:document> будет включен в XSLT 2.0, версию следует установить в «2.0»):

<HTML xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="1.1">

 <HEAD>

  <TITLE>

   Two Frames

  </TITLE>

 </HEAD>

 <FRAMESET cols="50%, 50%>

  <FRAME src="frame1.html"/>

  <xsl:document href="frame1.html">

   <HTML>

    <HEAD>

     <TITLE>

      Frame 1

     </TITLE>

    </HEAD>

    <BODY>

     <H1>This is frame 1.</H1>

    </BODY>

   </HTML>

  </xsl:document>

  .

  .

  .

После этого я могу создать вторую рамку и документ для вывода в нее, frame2.html (листинг 6.10).

Листинг 6.10. Применение <xsl:document>

<HTML xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="1.1">

 <HEAD>

  <TITLE>

   Two Frames

  </TITLE>

 </HEAD>

 <FRAMESET cols="50%, 50%>

  <FRAME src="frame1.html"/>

  <xsl:document href="frame1.html">

   <HTML>

    <HEAD>

     <TITLE>

      Frame 1

     </TITLE>

    </HEAD>

    <BODY>

     <H1>This is frame 1.</H1>

    </BODY>

   </HTML>

  </xsl:document>


  <FRAME src="frame2.html"/>

  <xsl:document href="frame2.html">

   <HTML>

    <HEAD>

     <TITLE>

      Frame 2

     </TITLE>

    </HEAD>

    <BODY>

     <H1>This is frame 2.</H1>

    </BODY>

   </HTML>

  </xsl:document>

 </FRAMESET>

</HTML>

ПРИМЕР ТОЛЬКО ДЛЯ XSLT 1.1

Обратите внимание на то, что этот пример предназначен только для рабочего проекта XSLT 1.1. Ни один из известных мне доступных процессоров XSLT пока не обрабатывает элемент <xsl:document>.

Элемент <xsl:namespace>: создание объявлений пространств имен

В XSLT 2.0 включен еще один новый элемент: <xsl:namespace>, позволяющий добавлять в результирующий документ объявления пространств имен. Однако на текущий момент больше об этом элементе ничего не известно, так что я не могу дать здесь более подробную информацию. Следите за web-узлом W3C.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*