Главная » XSLT » Расширения EXSLT для работы со строками

0

Задача

У вас есть основательные причины воспользоваться дополнительными функ­циями для обработки строк, но беспокоит вопрос переносимости.

Решение

Не исключено, что ваш процессор XSLT уже реализует строковые функции, определенные сообществом EXSLT (http://www.exslt.org). На момент работы над этой книгой в их число входили следующие функции.

node-set str::tokenize(string input, string delimiters?)

Функция str::tokenize разбивает строку на лексемы и возвращает набор уз­лов, состоящий из элементов token, каждый из которых содержит текст одной лексемы.

Первый аргумент – подлежащая разбиению строка. Второй аргумент – стро­ка, содержащая символы-разделители. Строка, переданная в первом аргументе, разбивается в местах, где встречается любой символ-разделитель.

Если второй аргумент опущен, по умолчанию подразумевается строка 	

  (то есть все символы пропуска).

Если второй аргумент – пустая строка, то функция возвращает набор элемен­тов token, каждый из которых содержит по одному символу.

node-set str::replace(string, object search, object replace)

Функция str:replace заменяет все вхождения искомых подстрок в исход­ную строку набором узлов замены, создавая набор узлов.

Первый аргумент – строка, в которой ищутся заменяемые подстроки.

Второй аргумент – объект, описывающий список искомых строк. Если он представляет собой набор узлов, то список искомых строк получается путем пре­образования каждого узла в строку с помощью функции string(), причем поря­док строк в списке определяется порядком узлов в документе. Если второй аргу­мент – не набор узлов, то он преобразуется в строку функцией string(), так что список искомых строк будет содержать всего одну строку.

Третий аргумент – объект, представляющий список узлов замены. Если это набор узлов, то список состоит из этих узлов, перечисленных в порядке докумен­та. Если же это не набор узлов, то список узлов замены состоит из единственного текстового узла, строковое значение которого получается преобразованием тре­тьего аргумента в строку функцией string().

string str::padding(number, string?)

Функция str::padding создает строку заполнения заданной длины.

Первый аргумент – длина требуемой строки заполнения.

Второй аргумент – строка, на основе которой создается строка заполнения. Она повторяется столько раз, сколько необходимо для получения строки, длина которой задана первым аргументом. Если эта строка содержит более одного сим­вола, то результат может быть обрезан для получения требуемой длины. Если вто­рой аргумент опущен, по умолчанию подразумевается пробел (""). Если второй аргумент – пустая строка, то str::padding возвращает пустую строку.

string str::align(string, string, string?)

Функция str::align выравнивает одну строку в границах другой.

Первый аргумент – строка, подлежащая выравниванию. Второй аргумент – строка заполнения, внутри которой выравнивается первая строка.

Если первая строка короче второй, то некоторые символы в строке заполне­ния заменяются символами из выравниваемой строки. Какие именно символы заменяются, зависит от значения третьего аргумента, определяющего способ вы­равнивания. Он может принимать значения left, right или center. Если тре­тий аргумент опущен или не совпадает с одним из указанных значений, по умол­чанию подразумевается left.

При выравнивании по левому краю диапазон символов, заменяемых вырав­ниваемой строкой, начинается с первого символа строки заполнения. При вы­равнивании по правому краю диапазон символов, заменяемых выравниваемой строкой, заканчивается последним символом строки заполнения. При выравнива­нии по центру диапазон символов, заменяемых выравниваемой строкой, находится в середине строки заполнения, то есть число не замененных символов слева и спра­ва от этого диапазона одинаково или слева на один символ меньше, чем справа.

Если выравниваемая строка длиннее строки заполнения, то она обрезается до той же длины, что строка заполнения, и возвращается получившийся результат.

string str::encode-uri(string)

Функция str:encode-uri возвращает закодированный URI. При этом сле­дующие символы не подвергаются кодированию: «: », «/», «;» и «?».

При кодировании URI небезопасные и зарезервированные символы заменя­ются строкой, которая начинается с символа «%», за которым следуют две шест- надцатеричные цифры (0-9, A-F), представляющие значение символа в кодировке ISO Latin 1.

string str::decode-uri(string)

Функция str:decode-uri раскодирует строку, содержащую закодирован­ный URI. См. описание функции str:encode-uri.

node-set str::concat(node-set)

Функция str:concat принимает набор узлов и возвращает строку, получа­ющуюся в результате конкатенации строковых значений этих узлов. Если набор узлов пуст, возвращается пустая строка.

node-set str::split(string, string?)

Функция str:split разбивает строку и возвращает набор узлов, состоящий из элементов token, каждый из которых содержит одну лексему. Первый аргумент – подлежащая разбиению строка, второй – строка-образец. Первая строка разбива­ется в местах, где обнаруживается текст, сопоставившийся с образцом.

Если второй аргумент опущен, по умолчанию принимается строка &#x2 0 (пробел).

Если второй аргумент – пустая строка, то функция возвращает набор элемен­тов token, каждый из которых содержит ровно один символ.

Обсуждение

Если вы пользуетесь строковыми функциями EXSLT, то переносимость не гарантируется, поскольку в настоящий момент ни одна реализация XSLT не поддерживает их все. Более того, на сайте EXSLT говорится, что для некото­рых функций пока нет вообще ни одной реализации. Сообщество EXSLT компен­сирует это, предоставляя, когда возможно, реализации на чистом XSLT, JavaScript или MSXML.

Убедительной причиной пользоваться расширениями EXSLT является тот факт, что члены этого коллектива играют весьма заметную роль в сообществе XSLT, поэтому многие реализации равно или поздно будут поддерживать боль­шую часть предлагаемых расширений. Не исключено также, что их работа хотя бы отчасти войдет в стандарт следующей версии XSLT.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии