KnigaRead.com/

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

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

    <TD>Radius</TD>

    <TD>Day</TD>

   </TR>

   <xsl:for-each select="//PLANET">

    <TR>

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

     <TD><xsl:value-of select="MASS"/></TD>

     <TD><xsl:value-of select="RADIUS"/></TD>

     <TD><xsl:value-of select="DAY"/></TD>

    </TR>

   </xsl:for-each>

  </TABLE>

 </BODY>

</HTML>

Данная версия работает точно так же, как и предыдущая версия planets.xsl, при этом совсем не используя элементы высокого уровня. Упрощенные таблицы стилей, такие как эта, были представлены в помощь авторам HTML при осуществлении преобразований в XSL, однако их применимость весьма ограничена. Очевидно, все равно нужно знать, как работать с элементами XSL, а отсутствие возможности использовать <xsl:template> в данном случае только затруднило работу. Однако вы должны знать, что упрощенные таблицы стилей существуют и включены в спецификацию XSLT.

ОБРАБОТКА ПО УМОЛЧАНИЮ БЕЗ ЭЛЕМЕНТА <XSL:STYLESHEET>

Если процессор XSLT не может найти в таблице стилей элемент <xsl:stylesheet>, он трактует таблицу как упрощенную таблицу стилей.

Встроенные таблицы стилей

Рекомендация XSLT также поддерживает встроенные таблицы стилей, embedded stylesheets (вслед за использованием встроенных таблиц стилей и элементов стиля в HTML), но, как и упрощенные таблицы стилей, они не очень распространены.

Встроенные таблицы стилей могут обрабатывать не все процессоры XSLT, но некоторые — в частности, Saxon — могут. Давайте рассмотрим пример. В этом случае я включил весь элемент таблицы стилей целиком из planets.xsl в planets.xml для создания нового документа, embedded.xml. В новом документе будут содержаться все данные и вся таблица стилей. Заметьте, что для того, чтобы быть хорошо сформированным XML, embedded.xml должен иметь только один корневой элемент, поэтому я сделал таблицу стилей (то есть элемент <xsl:stylesheet>) родительским элементом корневого элемента <PLANETS>.

Чтобы указать, какой элемент будет трактоваться как встроенная таблица стилей, я задал элементу <xsl:stylesheet> ID "stylesheet", установив атрибут id в это имя:

<xsl:stylesheet version="1.0" id="stylesheet"

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

В начале документа я также присваиваю это имя, "stylesheet", атрибуту href элемента <?xml-stylesheet?>:

<?xml-stylesheet type="text/xml" href="#stylesheet"?>

Теперь процессору XSLT известно, какой элемент я хочу использовать в качестве таблицы стилей — элемент с ID "stylesheet". Но что это за элемент? Элементы XML формируют элементы типа ID в объявлениях DTD или схемах XML, и, как вы помните, информация объявлений DTD и схем пока еще не передается процессору XSLT.

Некоторые процессоры XSLT, такие как Saxon, читают объявление DTD, если оно есть, для определения атрибутов, обладающих типом ID, поэтому я включил DTD в embedded.xml (листинг 2.8).

Листинг 2.8. planets.xml со встроенной таблицей стилей

<?xml version="1.0"?>

<?xml-stylesheet type="text/xml" href="#stylesheet"?>

<!DOCTYPE PLANETS [

<!ELEMENT PLANET (CUSTOMER)*>

<!ELEMENT CUSTOMER (NAME,MASS,RADIUS,DAY)>

<!ELEMENT NAME (#PCDATA)>

<!ELEMENT MASS (#PCDATA)>

<!ELEMENT RADIUS (#PCDATA)>

<!ELEMENT DAY (#PCDATA)>

<!ELEMENT xsl:stylesheet (xsl:template)*>

<!ELEMENT xsl:template (#PCDATA)>

<!ATTLIST xsl:stylesheet

 id ID #REQUIRED

 version CDATA #IMPLIED>

]>

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

 <PLANET>

  <NAME>Earth</NAME>

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

  <DAY UNITS="days">1</DAY>

  <RADIUS UNITS="miles">2107</RADIUS>

  <DENSITY UNITS="(Earth = 1)">1</DENSITY>

  <DISTANCE UNITS="million miles">128.4</DISTANCE><!--B перигелии-->

 </PLANET>


 <xsl:stylesheet version="1.0" id="stylesheet"

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

  <xsl:template match="/PLANETS">

   <HTML>

    <HEAD>

     <TITLE>

      The Planets Table

     </TITLE>

    </HEAD>

    <BODY>

     <H1>

      The Planets Table

     </H1>

     <TABLE BORDER="2">

      <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:value-of select="MASS"/></TD>

    <TD><xsl:value-of select="RADIUS"/></TD>

    <TD><xsl:value-of select="DAY"/></TD>

   </TR>

  </xsl:template>


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

 </xsl:stylesheet>

</PLANETS>

Следует отметить еще одно: включив всю таблицу стилей в файле embedded.xml в элемент <xsl:stylesheet>, я должен был предоставить шаблон таблицы стилей для элемента <xsl:stylesheet>. (Если бы я этого не сделал, текст из текстовых узлов таблицы стилей был бы скопирован в результирующий документ, — это обсуждается в главе 3 в разделе, посвященном правилам по умолчанию для шаблонов.) Я оставил этот элемент пустым, поместив в конце таблицы стилей в embedded.xml следующую строку, поэтому из самой таблицы стилей в результирующий документ ничего не копируется:

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

Теперь в Saxon я могу из embedded.xml создать planets.html. В Windows для указания того, что используется встроенная таблица стилей, в Saxon служит параметр -а:

C:planets>saxon -a embedded.xml > planets.html

Элемент <xsl:include>

Другой способ вставить таблицы стилей внутрь других документов — использовать элемент <xsl:include>, позволяющий включить содержимое файла в определенное место в таблице стилей. У этого элемента только один атрибут:

• href (обязательный). URI таблицы стилей, которую вы хотите включить.

Этот элемент пустой и не обладает никаким содержимым.

Рассмотрим листинг 2.9. В этом случае я помещу часть таблицы стилей из planets.xsl в новый документ, rules.xml. Затем я смогу включить rules.xml в planets.xsl.

Листинг 2.9. Включение таблицы стилей

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:include href="rules.xsl"/>

 <xsl:template match="/PLANETS">

  <HTML>

   <HEAD>

    <TITLE>

     The Planets Table

    </TITLE>

   </HEAD>

   <BODY>

    <H1>

     The Planets Table

    </H1>

    <TABLE BORDER="2">

     <TD>Name</TD>

     <TD>Mass</TD>

     <TD>Radius</TD>

     <TD>Day</TD>

     <xsl:apply-templates/>

    </TABLE>

   </BODY>

  </HTML>

 </xsl:template>

</xsl:stylesheet>

А вот как выглядит rules.xsl (листинг 2.10). Обратите внимание на то, что это полный документ XSL с объявлением XML и элементом <xsl:stylesheet>.

Листинг 2.10. rules.xsl

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:template match="PLANET">

  <TR>

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

   <TD><xsl:value-of select="MASS"/></TD>

   <TD><xsl:value-of select="RADIUS"/></TD>

   <TD><xsl:value-of select="DAY"/></TD>

  </TR>

 </xsl:template>

</xsl:stylesheet>

Вот как это работает. Кроме <xsl:include>, для вставки таблиц стилей или фрагментов таблицы стилей можно также применять <xsl:import>.

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