Книга: XSLT

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

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

Рекомендация 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"
 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"
  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

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


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