You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(., '[-/]', ' '), ' ', '&#x0001;')"
          collation="http://saxon.sf.net/collation?algo=uca;lang=en-US"/>

逻辑说明:

  1. 第一步replace(., '[-/]', ' '):将字符串中的连字符、斜线替换为空格,实现三者等效;
  2. 第二步replace(..., ' ', '&#x0001;'):将空格替换为Unicode控制字符SOH(&#x0001;),该字符的UCA排序优先级远低于所有字母;
  3. 基于UCA排序时,替换后的字符串中,原空格位置的SOH会比字母更早出现,因此ABSENTEE VOTING(处理后为ABSENTEE&#x0001;VOTING)会排在ABSENTEES之前。

验证说明

两种方案都需要针对你的目标排序集合进行测试:

  • 对于UCA规则方案,需确保reorder元素的配置正确调整了空格相对于字母的优先级;
  • 对于排序键方案,需确认所选控制字符在UCA排序中的位置符合预期(避免与其他特殊字符冲突)。

内容的提问来源于stack exchange,提问作者Trevor Lawrence

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:30:30