如何使用XSLT按逗号拆分XML元素值并生成独立XML结构?
解决方案:拆分XML中逗号分隔元素生成独立结构
要实现将XML中单个元素内的逗号分隔值拆分,并生成对应独立的XML节点结构,使用XSLT 2.0是最直接的方案,以下是具体实现:
完整XSLT转换代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://sap.com/xi/SAPGlobal20/Global"> <!-- 身份模板:复制所有未被特殊匹配的节点/属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配需要拆分的SalesProcessInformation节点 --> <xsl:template match="SalesProcessInformation"> <!-- 拆分销售组织ID,过滤空值(处理末尾逗号) --> <xsl:variable name="salesOrgIds" select="tokenize(SalesOrganisationID, ',')[normalize-space() != '']"/> <!-- 拆分生命周期状态码,过滤空值 --> <xsl:variable name="statusCodes" select="tokenize(LifeCycleStatusCode, ',')[normalize-space() != '']"/> <!-- 遍历每个拆分后的条目,生成独立的SalesProcessInformation节点 --> <xsl:for-each select="1 to count($salesOrgIds)"> <xsl:variable name="pos" select="position()"/> <SalesProcessInformation> <!-- 复制除目标元素外的所有子节点 --> <xsl:apply-templates select="*[not(self::SalesOrganisationID or self::LifeCycleStatusCode)]"/> <!-- 插入对应位置的销售组织ID --> <SalesOrganisationID> <xsl:value-of select="$salesOrgIds[$pos]"/> </SalesOrganisationID> <!-- 插入对应位置的生命周期状态码 --> <LifeCycleStatusCode> <xsl:value-of select="$statusCodes[$pos]"/> </LifeCycleStatusCode> </SalesProcessInformation> </xsl:for-each> </xsl:template> </xsl:stylesheet>
关键逻辑说明
- 身份模板:确保XML中不需要修改的节点(如外层结构、其他固定属性/元素)完全复制,保留原有XML的结构完整性。
- 值拆分处理:使用
tokenize()函数按逗号分割目标元素的文本值,同时通过[normalize-space() != '']过滤掉末尾逗号产生的空字符串,避免生成无效的空节点。 - 节点生成:遍历拆分后的数组长度,为每个索引位置生成独立的
SalesProcessInformation节点:- 先复制该节点下除
SalesOrganisationID和LifeCycleStatusCode外的所有子元素(保持固定字段不变); - 再插入对应索引位置的拆分后值,保证两个字段的条目一一对应。
- 先复制该节点下除
使用方式
将上述XSLT代码保存为.xsl文件,使用支持XSLT 2.0的工具(如Saxon、Altova XMLSpy)或在线XSLT转换器,将输入XML与该XSLT文件进行转换,即可得到期望的输出结构。
内容的提问来源于stack exchange,提问作者Yatan
相关产品推荐
相关产品推荐

