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

如何使用XSLT拆分XML逗号分隔数据并生成多个对应节点

XSLT转换实现方案

你需要的功能可以通过以下两种主流XSLT版本实现:

方案1:XSLT 2.0/3.0版本(推荐,写法简洁)

XSLT 2.0自带tokenize()函数可以直接拆分逗号分隔字符串,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    
    <xsl:template match="/data">
        <!-- 拆分first和second字段为序列 -->
        <xsl:variable name="firstList" select="tokenize(first, ',')"/>
        <xsl:variable name="secondList" select="tokenize(second, ',')"/>
        <!-- 遍历索引生成result节点 -->
        <xsl:for-each select="1 to count($firstList)">
            <result>
                <first><xsl:value-of select="$firstList[position() = current()]"/></first>
                <second><xsl:value-of select="$secondList[position() = current()]"/></second>
            </result>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

逻辑说明:先把两个字段的内容按逗号拆成字符串序列,再按索引一一对应取值,生成对应的<result>节点即可,默认会自动处理两个序列长度一致的场景,如果你有长度不一致的需求可以额外加判断。

方案2:XSLT 1.0兼容版本

XSLT 1.0没有内置拆分函数,需要通过递归模板实现字符串拆分,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    
    <!-- 递归拆分逗号分隔字符串的模板 -->
    <xsl:template name="splitString">
        <xsl:param name="str"/>
        <xsl:param name="delimiter" select="','"/>
        <xsl:if test="string-length($str) > 0">
            <xsl:variable name="item" select="substring-before(concat($str, $delimiter), $delimiter)"/>
            <item><xsl:value-of select="$item"/></item>
            <xsl:call-template name="splitString">
                <xsl:with-param name="str" select="substring-after($str, $delimiter)"/>
                <xsl:with-param name="delimiter" select="$delimiter"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    
    <xsl:template match="/data">
        <!-- 拆分两个字段为节点集 -->
        <xsl:variable name="firstNodes">
            <xsl:call-template name="splitString">
                <xsl:with-param name="str" select="first"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="secondNodes">
            <xsl:call-template name="splitString">
                <xsl:with-param name="str" select="second"/>
            </xsl:call-template>
        </xsl:variable>
        <!-- 支持XSLT 1.0的节点集转换 -->
        <xsl:variable name="firstList" select="exsl:node-set($firstNodes)/item" xmlns:exsl="http://exslt.org/common"/>
        <xsl:variable name="secondList" select="exsl:node-set($secondNodes)/item" xmlns:exsl="http://exslt.org/common"/>
        
        <!-- 遍历生成result节点 -->
        <xsl:for-each select="$firstList">
            <xsl:variable name="pos" select="position()"/>
            <result>
                <first><xsl:value-of select="."/></first>
                <second><xsl:value-of select="$secondList[$pos]"/></second>
            </result>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

注意:如果使用微软的MSXML解析器,需要把exsl:node-set替换为msxsl:node-set,同时命名空间改为xmlns:msxsl="urn:schemas-microsoft-com:xslt"。

内容的提问来源于stack exchange,提问作者Arul Suju

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:45:06