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

如何使用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>&#10;            </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>&#10;            </xsl:text>
                </xsl:if>
            </xsl:for-each>
            <!-- 输出body闭合标签前的缩进换行 -->
            <xsl:text>&#10;        </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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:27:45