Saxon-EE 11中基于UCA实现特殊字符串排序的技术求助
实现自定义排序的解决方案
针对你在Saxon-EE 11中基于UCA实现特定排序规则的需求,以下是可行的方案:
一、通过自定义UCA排序规则实现(推荐)
Saxon-EE支持自定义符合Unicode Collation Algorithm(UCA)的排序规则文件,可同时满足你的两个需求:
1. 编写自定义UCA规则文件
创建一个XML格式的排序规则文件(例如custom-en-us-collation.xml),内容如下:
<collation xmlns="http://www.w3.org/2005/xpath-functions/collation" version="1.0" xml:lang="en-US"> <!-- 将连字符、斜线映射为空格,实现等效排序 --> <characterMapping> <map from="-" to=" "/> <map from="/" to=" "/> </characterMapping> <!-- 调整空格的排序优先级,让其在字母之前 --> <!-- 这样当前缀相同时,带空格的字符串会排在后续为字母的字符串前面 --> <reorder> <before codepoint="0020" after="Z"/> </reorder> </collation>
2. 在XSLT中使用该自定义排序规则
在xsl:sort指令中,通过collation属性指定自定义规则文件的URI(例如本地文件路径或类路径):
<xsl:sort select="." collation="file:///path/to/custom-en-us-collation.xml"/>
Saxon会加载这个自定义规则,处理字符映射并调整空格的排序优先级,从而满足你的两个需求。
二、通过预处理生成自定义排序键实现
如果不想编写UCA规则文件,可通过预处理字符串生成自定义排序键,间接实现需求:
<xsl:sort select="replace(replace(., '[-/]', ' '), ' ', '')" collation="http://saxon.sf.net/collation?algo=uca;lang=en-US"/>
逻辑说明:
- 第一步
replace(., '[-/]', ' '):将字符串中的连字符、斜线替换为空格,实现三者等效; - 第二步
replace(..., ' ', ''):将空格替换为Unicode控制字符SOH(),该字符的UCA排序优先级远低于所有字母; - 基于UCA排序时,替换后的字符串中,原空格位置的SOH会比字母更早出现,因此
ABSENTEE VOTING(处理后为ABSENTEEVOTING)会排在ABSENTEES之前。
验证说明
两种方案都需要针对你的目标排序集合进行测试:
- 对于UCA规则方案,需确保
reorder元素的配置正确调整了空格相对于字母的优先级; - 对于排序键方案,需确认所选控制字符在UCA排序中的位置符合预期(避免与其他特殊字符冲突)。
内容的提问来源于stack exchange,提问作者Trevor Lawrence
相关产品推荐
相关产品推荐

