如何使用 xsl:sort 与外来字符(即“æ”、“ø”和“å”)

Posted

技术标签:

【中文标题】如何使用 xsl:sort 与外来字符(即“æ”、“ø”和“å”)【英文标题】:How to use xsl:sort with foreign characters (i.e., 'æ', 'ø' and 'å') 【发布时间】:2011-11-13 15:34:20 【问题描述】:

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

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"/>

如您所见,这非常少。是在多个地方使用它的更简单的方法(例如指定模式或其他东西),还是另一种不那么广泛的方法。

【问题讨论】:

【参考方案1】:

如果您的 XSLT 处理器能够识别它,您应该可以简单地添加

lang="no"

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

【讨论】:

【参考方案2】:

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

类似这样的:

<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

【讨论】:

感谢您的回复,但我将不得不接受 Michael Kay 对此的回答。

以上是关于如何使用 xsl:sort 与外来字符(即“æ”、“ø”和“å”)的主要内容,如果未能解决你的问题,请参考以下文章

MS Word Ole 自动化、ADO 和外来字符

前同级和 xsl:sort 之间的冲突

如何恢复西里尔短语“Âñòîðîíó Äîæäÿ”的正确字符编码?

XSLT 中的 XSL 排序

在UTF-8 chracter中将长字符串剪切为中等显示字符串

文件读取外来字符