Принятые кодировки символов указаны в рекомендации 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
элемента <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>