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() > 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>
修正要点
- 提取最后一个逗号内容:新增递归模板
get-last-part,通过递归调用不断截取逗号后的内容,直到没有逗号为止,最终得到最后一段内容 - 移除多余Street节点:将原
Street[position() > 1]的模板改为空实现,直接跳过该节点的输出,避免原代码输出文本内容的问题 - 清理空格:使用
normalize-space处理提取的内容,自动去除前后的多余空格,保证输出格式整洁
内容的提问来源于stack exchange,提问作者TulioVargas
相关产品推荐
相关产品推荐

