如何使用xsl:sort与外来字符(即'æ','ø'和'å')

时间:2011-09-09 09:28:55

标签: xslt xslt-2.0

我正在尝试按每个元素的名称对列表进行排序。例如:

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 个答案:

答案 0 :(得分:4)

如果您的XSLT处理器识别它,您应该只需添加

lang="no"

到xsl:sort元素。 (我认为“不”是挪威语的语言代码,如果我错了,请纠正我。)

答案 1 :(得分:0)

如果长字符串没有改变(我假设它们没有改变),你可以将它们存储在单独的变量中,而只是使用它们?我知道这不是最漂亮的解决方案,但它会缩短你的排序表达,并且更容易实现对“字母”的更改。

这样的事情:

<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