如何用XSLT对所有文本节点应用模板并在XML转换后去除首尾空格
用XSLT实现XML格式转换+文本首尾空格清理
针对你这种既要完成XML结构转换,又要清理所有文本元素首尾空格的需求,用XSLT来实现是最直接高效的方案——它天生就是为XML转换设计的,处理文本清理也不在话下。
核心实现思路
咱分两步走:
- 第一步:全局处理所有文本节点,用
normalize-space()函数去除首尾空格(还能顺便把中间的多空格/换行/制表符换成单个空格,要是你只想保留中间格式,后面有替代方案); - 第二步:按照你的目标XML结构,编写对应的节点匹配和转换规则。
完整XSLT示例代码
假设你的目标格式是把<Record>转换成<CustomerVehicle>,并调整部分字段名称(比如VehType改名为VehicleType),下面是可直接复用的代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 全局模板:处理所有文本节点,去除首尾空格 --> <xsl:template match="text()"> <xsl:value-of select="normalize-space(.)"/> </xsl:template> <!-- 保留根节点并替换为目标根节点 --> <xsl:template match="/Records"> <CustomerVehicles> <xsl:apply-templates select="Record"/> </CustomerVehicles> </xsl:template> <!-- 转换Record节点为CustomerVehicle结构 --> <xsl:template match="Record"> <CustomerVehicle> <FullName> <!-- 自动继承文本去空格处理,拼接姓名 --> <xsl:value-of select="FirstName"/> <xsl:text> </xsl:text> <xsl:value-of select="MiddleName"/> <xsl:text> </xsl:text> <xsl:value-of select="LastName"/> </FullName> <VehicleType> <xsl:apply-templates select="VehType"/> </VehicleType> <VehicleSubType> <xsl:apply-templates select="VehType2"/> </VehicleSubType> <VehicleMake> <xsl:apply-templates select="VehMake"/> </VehicleMake> <VehicleModel> <xsl:apply-templates select="VehModel"/> </VehicleModel> <!-- 其他字段照着上面的格式添加即可 --> </CustomerVehicle> </xsl:template> <!-- 默认模板:复制未被自定义模板处理的节点/属性(可选保留) --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
关键细节调整
仅去除首尾空格(保留中间格式):
如果你不想改动中间的多空格或换行,把文本模板换成XSLT 2.0+的replace()写法:<xsl:template match="text()"> <xsl:value-of select="replace(., '^\s+|\s+$', '')"/> </xsl:template>用XSLT 1.0的话可以用字符串拼接技巧:
<xsl:template match="text()"> <xsl:value-of select="translate(normalize-space(concat(' ', ., ' ')), ' ', ' ')"/> </xsl:template>自定义结构转换:
你可以完全按需修改<xsl:template match="Record">里的节点结构——比如删除不需要的字段(直接不写对应的apply-templates)、新增计算字段、合并多个原字段等。测试方式:
你可以用本地XSLT处理器(比如Saxon、Xalan)通过命令行处理,或者用本地运行的XSLT测试工具,把输入XML和XSLT贴进去就能看到转换结果。比如输入里的<FirstName> ALICE </FirstName>,转换后会变成<FirstName>ALICE</FirstName>,完美清理首尾空格。
内容的提问来源于stack exchange,提问作者Ahnassi
相关产品推荐
相关产品推荐

