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

XSL代码修正需求:拆分Street字段提取首尾内容并移除多余节点

解决XSL代码处理XML的输出问题

需求说明

  • 第一个<Street>节点保留第一个逗号前的内容,生成新的<Street>节点
  • 从第一个<Street>节点中提取最后一个逗号后的内容,生成第二个<Street>节点
  • 移除原XML中的第二个<Street>节点

源XML

<Delivery>
         <DeliverTo>john Letter</DeliverTo>
         <Street>Block 1, lorem ipsum, test 123, Last part of the address</Street>
         <Street>Brooklyn</Street>
         <PostalCode>6011</PostalCode>
</Delivery>

原错误XSL代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Street[1]">
        <xsl:variable name="street" select="substring-before(.,',')"/>
        <Street>
            <xsl:value-of select="$street"/>
        </Street>
        <Street>
            <xsl:value-of select="substring-after(.,',')"/>
        </Street>
    </xsl:template>
    <xsl:template match="Street[position() &gt; 1]">
        <xsl:value-of select="."/>
    </xsl:template>
</xsl:stylesheet>

当前错误输出

<Delivery>
   <DeliverTo>john Letter</DeliverTo>
   <Street>Block 1</Street>
   <Street> lorem ipsum, test 123, Last part of the address</Street>
   Brooklyn
   <PostalCode>6011</PostalCode>
</Delivery>

修正后的XSL代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 处理第一个Street节点 -->
    <xsl:template match="Street[1]">
        <!-- 保留第一个逗号前的内容,去除前后空格 -->
        <Street>
            <xsl:value-of select="normalize-space(substring-before(., ','))"/>
        </Street>
        <!-- 提取最后一个逗号后的内容生成新Street节点 -->
        <Street>
            <xsl:call-template name="get-last-part">
                <xsl:with-param name="text" select="."/>
            </xsl:call-template>
        </Street>
    </xsl:template>

    <!-- 直接移除所有后续的Street节点 -->
    <xsl:template match="Street[position() > 1]"/>

    <!-- 递归模板:递归提取最后一个逗号后的内容 -->
    <xsl:template name="get-last-part">
        <xsl:param name="text"/>
        <xsl:choose>
            <xsl:when test="contains($text, ',')">
                <xsl:call-template name="get-last-part">
                    <xsl:with-param name="text" select="substring-after($text, ',')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="normalize-space($text)"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

预期输出

<Delivery>
         <DeliverTo>john Letter</DeliverTo>
         <Street>Block 1</Street>
         <Street>Last part of the address</Street>
         <PostalCode>6011</PostalCode>
</Delivery>

修正要点

  1. 提取最后一个逗号内容:新增递归模板get-last-part,通过递归调用不断截取逗号后的内容,直到没有逗号为止,最终得到最后一段内容
  2. 移除多余Street节点:将原Street[position() > 1]的模板改为空实现,直接跳过该节点的输出,避免原代码输出文本内容的问题
  3. 清理空格:使用normalize-space处理提取的内容,自动去除前后的多余空格,保证输出格式整洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:25:24