function milesToKilometers(e) {
miles = parseInt(e.text);
return miles * 1.6;
}
]]>
</xsl:script>
<xsl:template match='/'>
<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='PLANETS'>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match='PLANET'>
<TR>
<TD><xsl:value-of select='NAME'/></TD>
<TD><xsl:value-of select='MASS'/></TD>
<TD><xsl:apply-templates match='RADIUS'/></TD>
<TD><xsl:value-of select='DAY'/></TD>
</TR>
</xsl:template>
<xsl:template match='RADIUS'>
<xsl:eval>milesToKilometers(this)</xsl:eval>
</xsl:template>
</xsl:stylesheet>
Вот и все, результат этого преобразования приведен на рис. 5.4.

Рис. 5.4. Применение функции расширения в Internet Explorer
Со временем производители будут поставлять все больше и больше функций расширения. Как можно определить, доступна ли заданная функция расширения? Для этого служит функция function- available
.
Применение функции function-available
Функция XSLT 1.0 function-available
служит для проверки доступности функции. В следующем примере я хочу воспользоваться функцией расширения starpowder:calculate
для математических вычислений, а если она недоступна, я отправляю в результирующий документ текст «Sorry, can't do math today.» (Извините, сегодня математические вычисления не работают.), хотя можно, конечно, прекратить обработку и вывести сообщение об ошибке при помощи элемента <xsl:message>
:
<xsl:choose xmlns:starpowder='http://www.starpowder.com'>
<xsl:when test='function-available ('starpowder:calculate')'>
<xsl:value-of select='starpowder:calculate('2+2')'/>
</xsl:when>
<xsl:otherwise>
<xsl:text>Sorry, can't do math today.</xsl:text>
</xsl:otherwise>
</xsl:choose>
Внешние объекты
В рабочем проекте XSLT 1.1 для поддержки функций расширения появился новый тип данных — внешний объект (external object). Переменной XSLT, о которой пойдет речь в главе 9, может быть присвоен внешний объект — так же, как и один из четырех типов данных XPath, поддерживаемых в XSLT (строка, число, логическое значение, набор узлов). Внешний объект представляет объект, который создается внешним языком программирования, возвращается функцией расширения и не может быть преобразован в один из четырех типов данных XPath. Тип данных «external object
» был добавлен в XSLT для того, чтобы предоставить вам безопасную «оболочку» для таких данных. Пока еще никто не реализовал поддержку внешних объектов, но это ожидается в скором времени.
Элементы расширения
Элементы расширения — это элементы, добавленные в XSLT пользователем или производителем. В рабочем проекте XSLT 1.1 для элементов расширения был установлен ряд правил, и в XSLT 2.0 предполагается более широкая их поддержка.
В рабочем проекте XSLT 1.1 правила определяли, что элементами расширения должны быть