<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
</TR>
<TR>
<TD>Mercury</TD>
<TD>0.055 (Earth = 1)</TD>
<TD>1.516 miles</TD>
<TD>58.65 days</TD>
</TR>
<TR>
<TD>Venus</TD>
<TD>0.815 (Earth = 1)</TD>
<TD>3.716 miles</TD>
<TD>116.75 days</TD>
</TR>
<TR>
<TD>Earth</TD>
<TD>1 (Earth = 1)</TD>
<TD>2.107 miles</TD>
<TD>1 days</TD>
</TR>
</TABLE>
</BODY>
</HTML>
Этот результирующий документ показан на рис. 8.1. (MSXML3 и Saxon отбрасывают лидирующие нули, поэтому 0.055 выводится как .055 и т.д.)
Рис. 8.1. Форматирование чисел при помощи XSLT
Следующие примеры демонстрируют способы применения форматирующих строк. Заметьте, что при помощи точки с запятой (;) можно отделять образцы для положительных и отрицательных чисел.
Число Форматирующая строка Результат 4567 #,### 4,567 4567.8 ####.# 4567.8 4567.8 #,##0.00 4,567.80 456.789 #,##0.00 456.79 4567890 #,##0.00 4,567,890.00 4567 ###0.0### 4567.0 .00045 ##0.0### 0.0005 .45 #00% 45% -4.56 #.00;(#.00) (4.56) -45 #,##0.00 -45function-available()
При помощи функции XSLT 1.0 function-available можно проверить наличие функции расширения:
boolean function-available(function-name)
Функция принимает в качестве параметра имя искомой функции и, если функция доступна, возвращает истину, если нет — ложь.
Следующий пример мы уже рассматривали в главе 5. В этом случае я хочу выполнить ряд математических операций при помощи функции расширения starpowder:calculate, и если она отсутствует, вывести в результирующий документ текст «Sorry, can't do math today.» (Извините, сегодня математические вычисления не работают.). Можно, конечно, также прекратить обработку и вывести сообщение об ошибке при помощи элемента <xsclass="underline" message>:
<xsclass="underline" choose xmlns:starpowder="http://www.starpowder.com">
<xsclass="underline" when test="function-available('starpowder:calculate')">
<xsclass="underline" value-of select="starpowder:calculate('2+2')"/>
</xsclass="underline" when>
<xsclass="underline" otherwise>
<xsclass="underline" text>Sorry, can't do math today.</xsclass="underline" text>
</xsclass="underline" otherwise>
</xsclass="underline" choose>
generate-id()
Функция generate-id дает указание процессору XSLT присвоить узлу идентификатор (который возвращается как строка). Функция применяется следующим образом:
string generate-id(node)
Функции следует передать набор узлов, содержащий только узел, которому нужен идентификатор (все узлы после первого игнорируются); функция возвращает уникальный идентификатор для этого узла. Если передать функции снова этот же узел, она вернет тот же идентификатор. Заметьте, что идентификаторы различаются в зависимости от процессора XSLT.
Следующий пример взят из главы 6, но сейчас я собираюсь добавить в planets.html оглавление, составленное из гиперссылок. Для создания оглавления я прохожу в цикле по всем планетам при помощи элемента <xsclass="underline" for-each>. На каждом шаге цикла для текущей планеты я создаю гиперссылку и создаю атрибут HREF со значением, равным уникальному идентификатору, при помощи шаблона значений атрибута:
<?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" template match="/PLANETS">
<HTML>
<HEAD>
<TITLE>
The Planets Table
</TITLE>
</HEAD>
<BODY>
<H1>
The Planets Table
</H1>
<xsclass="underline" for-each select="PLANET">
<H2><A HREF="#{generate-id()}">
<xsclass="underline" value-of select="NAME"/>
</A></H2>
<P/>
</xsclass="underline" for-each>
.
.
.
Этот код добавляет каждой планете идентификатор и создает нужные гиперссылки. Я могу создать закладки гиперссылки в HTML-таблице данных планет, установив по очереди атрибут <NAME> закладки в идентификатор для каждого элемента <PLANET> так, чтобы он стал гиперссылкой-назначением:
<?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" template match="/PLANETS">
<HTML>
.
.
.
</HTML>
</xsclass="underline" template>
<xsclass="underline" template match="PLANET">
<TR>
<TD><A NAME="{generate-id(.)}">
<xsclass="underline" value-of select="NAME"/>
</A></TD>
<TD><xsclass="underline" apply-templates select="MASS"/></TD>
<TD><xsclass="underline" apply-templates select="RADIUS"/></TD>
<TD><xsclass="underline" apply-templates select="DAY"/></TD>
</TR>
</xsclass="underline" template>
<xsclass="underline" template match="MASS">
<xsclass="underline" value-of select="."/>
<xsclass="underline" text> </xsclass="underline" text>