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

如何使用XSLT实现交叉引用中连续数字的分组处理?

使用XSLT合并连续引用编号的解决方案

要实现将<cross-refs>中的连续数字合并为范围格式的需求,可以借助XSLT 2.0及以上版本的分组功能完成,以下是具体实现代码:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="cross-refs">
        <xsl:copy>
            <!-- 清理输入文本,提取数字列表 -->
            <xsl:variable name="raw-text" select="replace(., '^\[|\]$', '')"/>
            <xsl:variable name="clean-text" select="replace($raw-text, '\s+', '')"/>
            <xsl:variable name="number-strings" select="tokenize($clean-text, ',')"/>
            <xsl:variable name="numbers" select="for $n in $number-strings return number($n)"/>
            
            <!-- 分组处理连续数字 -->
            <xsl:variable name="ranges">
                <xsl:for-each-group select="$numbers" group-adjacent="number(.) - position()">
                    <xsl:choose>
                        <xsl:when test="count(current-group()) > 1">
                            <xsl:value-of select="concat(current-group()[1], '-', current-group()[last()])"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="."/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each-group>
            </xsl:variable>
            
            <!-- 拼接结果并输出 -->
            <xsl:value-of select="concat('[', string-join($ranges, ','), ']')"/>
        </xsl:copy>
    </xsl:template>

    <!-- 保留其他节点的默认模板 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

代码关键逻辑说明

  1. 文本清理:先移除输入文本两端的[],删除所有空格,再用逗号分割成单独的数字字符串并转换为整数序列。
  2. 连续数字分组:通过group-adjacent="number(.) - position()"实现分组——连续递增的数字,其「数值减去所在位置」的结果一致,以此为依据将连续数字归为一组。
  3. 范围生成:对每组数字,若组内元素数量大于1,输出「起始数字-结束数字」格式;否则直接输出单个数字。
  4. 结果拼接:将所有处理后的范围/数字用逗号连接,包裹[]后替换原<cross-refs>的内容。

测试验证

针对你给出的四个示例,该XSLT会输出预期结果:

  • 输入:<cross-refs>[5, 6, 7, 8, 9]</cross-refs> → 输出:<cross-refs>[5-9]</cross-refs>
  • 输入:<cross-refs>[4, 6, 7, 8, 9]</cross-refs> → 输出:<cross-refs>[4,6-9]</cross-refs>
  • 输入:<cross-refs>[4, 5, 6, 7, 9, 11, 12,13]</cross-refs> → 输出:<cross-refs>[4-7,9,11-13]</cross-refs>
  • 输入:<cross-refs>[4, 5, 6, 7, 9, 10, 11, 12, 13]</cross-refs> → 输出:<cross-refs>[4-7,9-13]</cross-refs>

内容的提问来源于stack exchange,提问作者Mahesh M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:50:27