如何使用 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 与外来字符(即“æ”、“ø”和“å”)的主要内容,如果未能解决你的问题,请参考以下文章
如何恢复西里尔短语“Âñòîðîíó Äîæäÿ”的正确字符编码?