Чтение онлайн

ЖАНРЫ

Холзнер Стивен

Шрифт:

В XSLT доступны следующие функции XPath для работы со строками:

• 

concat(string string1, string string2,...)
. Возвращает конкатенацию (объединение) всех переданных ей строк;

• 

contains(string string1, string string2)
. Возвращает истину, если первая строка содержит (contains) вторую строку;

• 

normalize-space(string string1)
. Возвращает строку
string1
(или контекстный узел, если строки
string1
нет) после отбрасывания лидирующих и завершающих символов-разделителей и замены нескольких последовательных
разделителей на один пробел;

• 

starts-with(string string1, string string2)
. Возвращает истину, если первая строка начинается (starts with) со второй подстроки;

• 

string(object)
. Преобразует объект в строку;

• 

string-length(string string1)
. Возвращает количество символов в строке
string1
;

• 

substring(string string1, number offset, number length)
. Возвращает
length
символов из строки, начиная со смещения
offset
;

• 

substring-after(string string1, string string2)
. Возвращает часть строки
string1
после первого вхождения
string2
;

• 

substring-before(string string1, string string2)
. Возвращает часть строки
string1
вплоть до первого вхождения строки
string2
;

• 

translate(string string1, string string2, string string3)
. Возвращает строку
string1
, в которой все вхождения символов в строке
string2
заменены на соответствующие символы в строке
string3
;

В последующих разделах я рассмотрю каждую из этих функций.

concat

Функция

concat
объединяет вместе все переданные ей строки и возвращает полученную строку:

concat(string string1, string string2, ...)

В качестве примера рассмотрите разработанный ранее вариант таблицы стилей

planets.xsl
, отображающей значения элементов и значения атрибутов
UNITS
, в котором шаблоны применяются следующим образом:

<xsl:template match="MASS">

 <xsl:value-of select="."/>

 <xsl:text> </xsl:text>

 <xsl:value-of select="@UNITS"/>

</xsl:template>

Такой код отображает строковое значение, контекстный узел, пробел и строковое значение атрибута UNITS. Но код можно значительно сократить при помощи функции

concat
(листинг 8.8).

Листинг 8.8. Применение функции concat

<?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="concat(., ' ', @UNITS)"/>

 </xsl:template>

 <xsl:template match="RADIUS">

<xsl:value-of select="concat(., ' ', @UNITS)"/>

 </xsl:template>

 <xsl:template match="DAY">

<xsl:value-of select="concat(., ' ', @UNITS)"/>

 </xsl:template>

</xsl:stylesheet>

contains

Функция

contains
проверяет, содержится ли одна строка внутри другой; если это так, функция возвращает истину, если нет — ложь. Функция применяется следующим образом:

boolean contains(container-string, contained-string)

Следующий пример взят из главы 7; в этом случае я хочу осуществить поиск слова «miles» во всех атрибутах, и если оно будет найдено, добавить в результирующий документ текст «You should switch to kilometers.» (Нужно перевести в километры.):

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

<TD><xsl:apply-templates select="DISTANCE"/></TD>

</TR>

 </xsl:template>

Поделиться с друзьями: