Главная » XSLT » Как обойтись без регулярных выражений

0

Задача

Вы хотели бы выполнять операции, подобные регулярным выражениям в XSLT 1.0, но не склонны прибегать к нестандартным расширениям.

Решение

Некоторые типичные сопоставления, свойственные регулярным выражени­ям, можно эмулировать в XPath 1.0. В таблице 2.1 приведены регулярные выраже­ния в синтаксисе Perl и эквивалентные им конструкции XSLT/XPath. Одиночный символ «С» обозначает любой заданный пользователем символ, а строка «abc» – произвольную строку ненулевой длины.

Таблица 2.1. Сопоставление с регулярными выражениями

$string =~ /ЛС*$/  translate($string,’C’,”) = ”

$string =~ /лС+$/  $string and translate($string,’C’,”) = ”

$string =~ /С+/    contains($string,’C’)

$string =~ /C{2,4}/      contains($string,’CC’) and not contains($string,’CCCC’)

$string =~ /Aabc/  starts-with($string,’abc’)

$string =~ /abc$/  substring($string, string-length($string) -

string-length(‘abc’) + 1) = ‘abc’

$string =~ /abc/   contains($string,’abc’)

$string =~ /A[AC]*$/      translate($string,’C’,”) = $string

$string =~ /A\s+$/ not(normalize-space($string))

$string =~ /\s/    translate(normalize-space($string), ‘ ‘, ”) != $string

$string =~ /A\S+$/ translate(normalize-space($string), ‘ ‘, ”) = $string

Обсуждение

Если нужно добиться краткости и мощи, то ничто не может сравниться с хоро­шим механизмом регулярных выражений. Однако многие простые операции сопоставления можно эмулировать с помощью не таких элегантных, но достаточно эффективных выражений XPath. При этом часто используется функция translate(), которая удаляет лишние символы, после чего сопоставление ста­новится простой проверкой на равенство. Еще одно полезное применение translate() – это возможность подсчитать число вхождений конкретного символа или символов из заданного набора. Например, следующий код вычисляет, сколь­ко раз в строке встречаются цифры:

string-length(translate($string,

translate($string, ‘0123456789’, ”), ”))

Если вам непонятно, как работает этот код, обратитесь к рецепту 2.3. Можно написать и так:

string-length($string) -

string-length(translate($string, ‘0123456789’, ”))

Здесь вместо translate() мы прибегаем к дополнительному вызову string-length() с последующим вычитанием. Возможно, это окажется чуть быстрее.

Важным отличием этих выражений XPath от их аналогов в Perl является то, что в Perl в качестве побочного эффекта сопоставления с образцом устанавливаются еще значения специальных переменных. С их помощью можно обрабатывать строки так, как XSLT и не снилось. Если кто-нибудь попробует «поженить» Perl и XSLT, при­думав гибридный язык, я хотел бы стать одним из первых альфа-тестеров!

Но радует то, что XPath 2.0 поддерживает регулярные выражения, и я рас­смотрю это давно ожидаемое дополнение в рецепте 2.1.

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

По теме:

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