如何使用XSL移除XML字符串中的指定部分内容
XSL实现XML body文本裁剪方案
核心处理逻辑是保留原XML外层结构不变,仅针对body节点内的自由文本做截取、清理、格式化:
- 以连续等号组成的分隔线为标记,截取两个分隔线中间的有效内容块,丢弃前后的问候语、冗余空行
- 对有效内容块逐行拆分,清理每行首尾的多余空白,过滤空行
- 按照目标格式要求给每行内容匹配对应缩进,保证输出XML格式对齐
完整XSL代码(基于XSLT 2.0,兼容性最佳)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 恒等模板:复制所有未单独匹配的节点、属性,保留原文档外层结构 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配body节点做定制化文本处理 --> <xsl:template match="body"> <xsl:copy> <!-- 输出body标签内的首行缩进 --> <xsl:text> </xsl:text> <!-- 按连续等号分隔线拆分文本,提取两个分隔线中间的内容段 --> <xsl:variable name="validContent" select="tokenize(., '=+')[2]"/> <!-- 按换行符拆分内容段为独立行,过滤空行 --> <xsl:variable name="contentLines" select="tokenize($validContent, '\n')[normalize-space(.) != '']"/> <!-- 逐行输出清理后的内容,补全行间缩进 --> <xsl:for-each select="$contentLines"> <xsl:value-of select="normalize-space(.)"/> <xsl:if test="position() != last()"> <xsl:text> </xsl:text> </xsl:if> </xsl:for-each> <!-- 输出body闭合标签前的缩进换行 --> <xsl:text> </xsl:text> </xsl:copy> </xsl:template> </xsl:stylesheet>
使用说明
- 上述代码可直接在Saxon、BaseX、AltovaXML等所有支持XSLT 2.0的处理器中运行,输出结果和给出的目标XML格式完全一致
- 如果使用的环境仅支持XSLT 1.0,只需要把代码中
tokenize函数替换为XSLT 1.0递归字符串拆分模板即可,核心截取、清理逻辑不需要改动 - 代码里的缩进空格数和示例目标格式完全对齐,如果需要调整缩进层级,直接修改
<xsl:text>标签里的空格数量即可
内容的提问来源于stack exchange,提问作者Anonymus007
相关产品推荐
相关产品推荐

