Принятые кодировки символов указаны в рекомендации XML 1.0, www.w3.org/TR/REC-xml.

Атрибут encoding не обязателен в объявлении XML документа; если он отсутствует, разборщики XML по умолчанию принимают кодировку UTF-8. Если вы хотите явно задать кодировку или использовать другую, ее можно задать следующим образом — там, где я задаю кодировку UTF-16:

<?xml version='1.0'?>

<xsl:stylesheet version='1.0'

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

 <xsl:output method='xml' encoding='UTF-16'/>

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

  <xsl:copy>

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

  </xsl:copy>

 </xsl:template>

</xsl:stylesheet>

Вот что появится в выходном документе:

<?xml version='1.0' encoding='UTF-16'?>

<?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><!--B перигелии-- >

 </PLANET>

 .

 .

 .

Режимы: форматирование в зависимости от контекста

В некоторых случаях выбор узлов может требовать буквально мастерства. Например, шаблон с условием выбора «*» выбирает и «PLANET». Если вам нужно обрабатывать элементы <PLANET> по-другому, чем все остальные элементы, вы можете задать шаблон, выбирающий «PLANET»; тогда процессор XSLT определит, что «PLANET» ближе к элементу <PLANET>, чем «*», и воспользуется правилом выбора «PLANET». Но не всегда все так просто. Например, вам может быть нужно, чтобы правило «PLANETS» выбирало не все, а лишь некоторые элементы <PLANET>. Один из способов решения этой задачи — воспользоваться режимами (mode).

Для задания режима обработки служит атрибут mode элемента <xsl:apply- templates>. При задании режима будут применяться только те шаблоны, элементы <xsl:template>, атрибут mode которых установлен в тот же режим. Таким образом, при помощи шаблона можно выбрать только один определенный узел, даже если в ином случае они бы выбирали много узлов. Это очень удобно, если, например, нам нужно обработать какие-то элементы <PLANET> отлично от других.

Рассмотрим пример. Здесь я создал новый режим обработки данных планет «fancy» (красивый), отображающий данные полужирным шрифтом. Но я хочу, чтобы полужирным выделялись только данные Земли, а не других планет. Это может составить проблему: поскольку все данные планет хранятся в одном типе элемента — <PLANET>, — постольку образец «PLANET» выберет их все. Режим решает это затруднение. В частности, если текущая планета — Земля, я могу установить режим обработки в «fancy»:

<?xml version='1.0'?>

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

  <xsl:if test='NAME='Earth''>

   <TR>

    <TD><xsl:apply-templates select='NAME' mode='fancy'/></TD>

    <TD><xsl:apply-templates select='MASS' mode='fancy'/></TD>

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату