Как найти слово в тексте с помощью XSLT 2.0 и REGEX (у которого нет границы слова \b)?

Я пытаюсь отсканировать строку слов и найти наличие определенного слова (без учета регистра) в таблице стилей XSLT 2.0, используя REGEX.

У меня есть список слов, которые я хочу перебрать и определить, существуют ли они в данной строке.

Я хочу сопоставить слово в любом месте заданного текста, но я не хочу сопоставлять внутри слова (например, поиск foo должен не совпадать с "food", а поиск bar должен не совпадать на "rebar").

XSLT 2.0 REGEX не имеет границы слова (\b), поэтому мне нужно воспроизвести его как можно лучше.


person Mads Hansen    schedule 07.03.2010    source источник


Ответы (2)


Вы можете использовать чередование, чтобы избежать повторения:

<xsl:if test="matches($prose, concat('(^|\W)', $word, '($|\W)'),'i')">
person Tim Pietzcker    schedule 07.03.2010
comment
Это выражение не будет компилироваться, потому что в XSLT нет незахватывающих групп. Тем не менее, \W поддерживается, и альтернативные шаблоны для первой и третьей группы действительно упрощают работу. Следующее выражение действительно работает: matches($prose, concat('(^|\W)', $word, '($|\W)'),'i') - person Mads Hansen; 08.03.2010

Если ваш процессор XSLT 2.0 — Saxon 9, вы можете использовать синтаксис регулярных выражений Java (включая \b) с функциями совпадения, токенизации и замены, начав атрибут флага с восклицательного знака:

<xsl:value-of select="matches('all foo is bar', '\bfoo\b', '!i')"/>

Майкл Кей недавно упомянул об этом в списке рассылки XSL.

person Martin Honnen    schedule 08.03.2010
comment
@Мартин, у тебя получилось? Я вижу, что Майкл Кей сказал, что это недокументированный, в значительной степени непроверенный и полностью несоответствующий вариант. Когда я запускаю его против Saxon 9.2.0.3 в oXygen 11, он выдает ошибку: net.sf.saxon.trans.XPathException: Invalid character '!' во флагах регулярных выражений - Недопустимый символ '!' в флагах регулярного выражения Начальное местоположение: 881:0 URL: w3 .org/TR/2005/WD-xpath-functions-20050211/#ERFORX0002 - person Mads Hansen; 09.03.2010
comment
Да, у меня он отлично работает с Saxon 9.2 HE, протестирован (сейчас) как с 9.2.0.5, так и с 9.2.0.3, запускается из командной строки, например. java -jar saxon9he.jar. Я не уверен, почему вы получаете эту ошибку, но этот URL-адрес, ссылающийся на рабочий проект (WD) версии функций XPath, может указывать на то, что вы используете более старую версию Saxon, чем вы думаете. - person Martin Honnen; 09.03.2010