Как убрать акценты с символов в XSL? - PullRequest
4 голосов
/ 23 марта 2011

Я продолжаю искать, но не могу найти функцию XSL, которая является эквивалентом "normalize-space" для символов.То есть, в моем контенте есть символы UNICODE с акцентом, и это здорово, но из этого контента я создаю имя файла, в котором эти акценты мне не нужны.

Итак, есть что-то, что яупускать или не правильно гуглить, чтобы легко обрабатывать символы?

В данных XML:

<filename>gri_gonéwiththèw00mitc</filename>

В таблице стилей XSLT:

<xsl:variable name="file">
    <xsl:value-of select="filename"/>
</xsl:variable>

<xsl:value-of select="$file"/>

приводит к «gri_gonéwiththèw00mitc»

, где

<xsl:value-of select='replace( normalize-unicode( "$file", "NFKD" ), "[^\\p{ASCII}]", "" )'/>

ничего не дает.

Я стремлюсь к gri_gonewiththew00mitc (без акцентов)

Использую ли яневерный синтаксис?

Ответы [ 3 ]

6 голосов
/ 23 марта 2011

В XSLT / XPath 1.0, если вы хотите заменить эти акцентированные символы на без акцентированных, вы можете использовать функцию translate().

Но это предполагает, что ваши "акцентированные символы Юникода" не состоят из символов Юникода. Если бы это было так, вам нужно использовать функцию XPath 2.0 normalize-unicode().

И, если реальная цель состоит в том, чтобы иметь действующий URI, вы должны использовать encode-for-uri()

Обновление : примеры

translate('gri_gonéwiththèw00mitc','áàâäéèêëíìîïóòôöúùûü','aaaaeeeeiiiioooouuuu')

Результат: gri_gonewiththew00mitc

encode-for-uri('gri_gonéwiththèw00mitc')

Результат: gri_gon%C3%A9withth%C3%A8w00mitc

Правильное выражение предоставьте предложение от @biziclop:

replace(normalize-unicode('gri_gonéwiththèw00mitc','NFKD'),'\P{ASCII}','')

Результат: gri_gonewiththew00mitc

Примечание : в XPath 2.0 правильное отрицание класса символов с большой буквы \P.

3 голосов
/ 23 марта 2011

Итак, вопреки моему комментарию, вы можете попробовать это:

replace( normalize-unicode( "öt hűtőházból kértünk színhúst", "NFKD" ), "[^\\p{ASCII}]", "" )

Хотя имейте в виду, что любые символы, которые не могут быть разложены и не являются базовыми ASCII (норвежский ø или исландский *)Например, 1005 *) будет полностью удален из строки, но это, вероятно, соответствует вашим требованиям.

1 голос
/ 25 февраля 2015

Предложенные ранее способы содержат неизвестный символьный класс с именем ASCII.По моему опыту, XPath 2.0 распознает класс BasicLatin, который должен служить той же цели, что и ASCII.

replace(normalize-unicode('Lliç d'Am Oükl Úkřeč', 'NFKD'), '\P{IsBasicLatin}', '')
...