XSLT - Стивен Холзнер
Шрифт:
Интервал:
Закладка:
• number(). Приводит переданный ей параметр к числу;
• round(). Округляет переданное функции число до ближайшего целого;
• sum(). Возвращает сумму переданных функции чисел.
В следующих разделах мы рассмотрим примеры применения каждой из этих функций.
ceiling()
Функция ceiling возвращает наименьшее целое, которое все еще больше переданного функции числа, то есть она возвращает следующее большее целое. Функция применяется следующим образом:
number ceiling(number)
Например, выражение
ceiling(3.1415926535)
возвращает 4.
floor()
Функция floor — парная к функции ceiling. Она возвращает наибольшее целое, которое все еще меньше переданного ей числа. Другими словами, функция возвращает предыдущее целое. Функция применяется следующим образом:
number floor(number)
В этом примере я при помощи floor преобразую длительность дней планет в целые числа:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/PLANETS">
<HTML>
.
.
.
</HTML>
</xsl:template>
<xsl:template match="PLANET">
<TR>
<TD><xsl:value-of select="NAME"/></TD>
<TD><xsl:apply-templates select="MASS"/></TD>
<TD><xsl:apply-templates select="RADIUS"/></TD>
<TD><xsl:apply-templates select="DAY"/></TD>
</TR>
</xsl:template>
<xsl:template match="MASS">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
<xsl:value-of select="@UNITS"/>
</xsl:template>
<xsl:template match="RADIUS">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
<xsl:value-of select="@UNITS"/>
</xsl:template>
<xsl:template match="DAY">
<xsl:value-of select="floor(.)"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@UNITS"/>
</xsl:template>
</xsl:stylesheet>
А вот результирующий документ:
<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>
<TR>
<TD>Mercury</TD>
<TD>.0553 (Earth = 1)</TD>
<TD>1516 miles</TD>
<TD>58 days</TD>
</TR>
<TR>
<TD>Venus</TD>
<TD>.815 (Earth = 1)</TD>
<TD>3716 miles</TD>
<TD>116 days</TD>
</TR>
<TR>
<TD>Earth</TD>
<TD>1 (Earth = 1)</TD>
<TD>2107 miles</TD>
<TD>1 days</TD>
</TR>
</TABLE>
</BODY>
</HTML>
number()
Функция number приводит свой аргумент к числу. Функция применяется следующим образом:
number number(object?)
В этом примере я передаю number строку:
number("456.7")
Это выражение возвращает число 456.7. Если вы попытаетесь преобразовать что-то, что number не сможет перевести в число, функция вернет значение XPath NaN (Not a Number, не число). NaN — корректное значение, которое можно проверять в выражениях Xpath.
round()
Функция round округляет переданное ей значение. Функция применяется следующим образом:
number round(number)
Например, round(3.1415926535) возвращает 3, round(4.5) возвращает 5 и round(-1.5) возвращает -1.
sum()
Функция sum суммирует численные значения набора узлов и возвращает результат. Функция применяется следующим образом:
number sum(node-set)
Взгляните на следующий пример из главы 4, который находит средние массы планет в planets.xml:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="PLANETS">
<HTML>
<BODY>
The average planetary mass is
<xsl:value-of select="sum(child::PLANET/child::MASS) div count(child::PLANET/child::MASS)"/>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
Логические функции XPath
XPath также поддерживает следующий набор логических функций:
• boolean(). Приводит аргумент к логическому значению;
• false(). Возвращает false (ложь);
• lang(). Проверяет, совпадает ли язык, установленный в атрибуте xml:lang, с языком, переданным в функцию;
• not(). Инвертирует значение truefalse аргумента;
• true(). Возвращает true (истина).
boolean()
Функция boolean преобразует аргумент в логическое значение. Функция применяется следующим образом:
boolean boolean(object)
Ниже показано, как функция работает с различными типами XPath:
• number. Если число равно нулю, результатом будет ложь; иначе результат — истина. NaN всегда возвращает ложь;
• string. Если строка не пуста, результат — истина, иначе — ложь;
• boolean. Значение не изменяется;
• nodeset. Пустой набор узлов дает ложь, не пустой — истину;
• Фрагмент результирующего дерева в XSLT 1.0 всегда дает истину.
false()
Функция false возвращает ложь. Она применяется следующим образом:
boolean false()
В XPath не определены логические константы, поэтому для того чтобы присвоить переменной значение false, нужно прибегнуть к функции false. (С переменными вы познакомитесь в главе 9.)
lang()
Функция lang проверяет, совпадает ли язык контекстного узла (определенный в атрибуте xml:lang) с переданным ей языком. Функция применяется следующим образом:
boolean lang(string)
Функции нужно передать строку, определяющую язык в спецификации XML, как, например, «en» для английского, «de» для немецкого и «jp» для японского.
В следующем примере я проверяю, написан ли исходный документ на английском. Сначала я устанавливаю атрибут xml:lang в planets.xml в значение, соответствующее английскому языку:
<?xml version="1.0"?>
<?xml=stylesheet type="text/xml" href="planets.xsl"?>
<PLANETS xml:lang="en">
<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>
.
.
.
Теперь я удостоверяюсь, что исходный документ на самом деле написан на английском, перед тем как применять к нему шаблоны:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/PLANETS">
<xsl:if test="lang('en')">
<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:if>
</xsl:template>
<xsl:template match="PLANET">
<TR>
<TD><xsl:value-of select="NAME"/></TD>
<TD><xsl:apply-templates select="MASS"/></TD>
<TD><xsl:apply-templates select="RADIUS"/></TD>
<TD><xsl:apply-templates select="DAY"/></TD>
</TR>
</xsl:template>
</xsl:stylesheet>
not()
Функция not инвертирует логическое значение аргумента. При передаче аргумента с логическим значением true она возвращает false; при передаче аргумента со значением false функция возвращает true. Функция применяется следующим образом: