Как использовать xsl: sort с иностранными символами (то есть, 'æ', 'ø' и 'å') - PullRequest
3 голосов
/ 09 сентября 2011

Я пытаюсь отсортировать список по имени каждого элемента.Пример:

Title One
Another Title
Å Another Title
Ø Yet Another Title

Вывод этого с использованием оригинальной функции сортировки приведет к чему-то вроде этого:

Another Title
Title One
Å Another Title
Ø Yet Another Title 

В то время как желаемый вывод:

Another Title
Title One
Ø Yet Another Title
Å Another Title

Для тех, кто не знаком со специальными символами «Æ», «Ø» и «Å», это три буквы, которые являются норвежским расширением алфавита.Таким образом, норвежский алфавит оканчивается так: "... STUVWXYZÆØÅ".И благодаря этому расширению использование обычного xsl: sort, например, поставит «Å» перед «Ø».Мне кажется, что xsl сортирует элементы на основе их значений ASCII, и по некоторым причинам значения ASCII не упорядочены правильно (т. Е. Не в том же порядке, что и алфавит) для «Æ», «Ø» и «Å».

Я нашел несколько решений для этого, однако он требует больше кода, чем мне нравится, и мне приходится использовать его в нескольких местах (в одном и том же xsl-документе), что делает его еще более громоздким с обширнымкод.Вот подход, который я использую сейчас:

<xsl:sort select="translate(current-grouping-key(), 'abcdefghijklmnopqrstuvwxyzæøåABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ0123456789', '0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZæÆøØåÅ')" data-type="text" order="ascending" case-order="lower-first"/>

Как видите, это довольно горстка.Или это более простой способ использовать это в нескольких местах (например, указание режима или что-то в этом роде), или другой подход, который не настолько широк.

Ответы [ 2 ]

4 голосов
/ 09 сентября 2011

При условии, что ваш XSLT-процессор распознает его, вы просто можете добавить

lang="no"

к элементу xsl: sort.(Я думаю, что «нет» - это код языка для норвежского языка, поправьте меня, если я ошибаюсь.)

0 голосов
/ 09 сентября 2011

Если длинные строки не меняются (я бы предположил, что они не меняются), вы могли бы хранить их в отдельных переменных и просто использовать их вместо этого? Я знаю, что это не самое красивое из решений, но оно сократит ваше выражение сортировки и облегчит реализацию изменений в «алфавите».

Примерно так:

<xsl:variable name="alpha1" select="abcdefghijklmnopqrstuvwxyzæøåABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ0123456789"/>
<xsl:variable name="alpha2" select="0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZæÆøØåÅ"/>
...
<xsl:sort select="translate(current-grouping-key(), $alpha1, $alpha2)" data-type="text" order="ascending" case-order="lower-first"/>

И, может быть, найти более подходящие имена для переменных: D

...