XSLT作为XML转换的常用技术,在处理源XML文档时,默认会对部分空白字符进行裁剪,而preserve-space和strip-space两个指令就是用来控制这个裁剪行为的,两者的作用场景和规则有明显的不同。

两个指令的基本定义
strip-space指令
strip-space指令用于指定一个或多个元素,当这些元素的内容只包含空白字符(比如空格、换行、制表符)时,XSLT处理器会将这些空白字符从输出中删除,减少无意义的空白内容。
preserve-space指令
preserve-space指令用于指定一个或多个元素,无论这些元素的内容是否只包含空白字符,XSLT处理器都会完整保留其中的所有空白字符,不会进行任何裁剪操作。
核心区别对比
两者的核心差异主要体现在作用目标、默认行为、优先级三个方面,具体对比如下:
| 对比维度 | strip-space | preserve-space |
|---|---|---|
| 作用目标 | 指定元素内仅含空白的内容 | 指定元素内的所有空白内容 |
| 默认行为倾向 | 裁剪无用空白 | 保留所有空白 |
| 优先级 | 低于preserve-space | 高于strip-space |
| 适用场景 | 不需要保留格式空格的普通元素 | 需要保留排版、缩进的代码类元素 |
使用示例说明
首先准备一份源XML文档,其中包含两种不同空格场景的元素:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<content>
</content>
<code_block>
function test() {
return true;
}
</code_block>
</root>
上面的XML中,content元素内部只有换行和缩进空白,code_block元素内部包含有实际意义的缩进空白。
仅使用strip-space的场景
编写XSLT样式表,只对content元素应用strip-space:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="content"/>
<xsl:template match="/">
<output>
<xsl:copy-of select="root/content"/>
<xsl:copy-of select="root/code_block"/>
</output>
</xsl:template>
</xsl:stylesheet>
转换后content元素的空白会被删除,code_block的空白会保留,因为默认情况下非指定元素的空白会被保留。
同时使用两个指令的场景
如果同时对两个元素分别应用两个指令:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="content"/>
<xsl:preserve-space elements="code_block"/>
<xsl:template match="/">
<output>
<xsl:copy-of select="root/content"/>
<xsl:copy-of select="root/code_block"/>
</output>
</xsl:template>
</xsl:stylesheet>
此时preserve-space的优先级更高,即使code_block同时被其他规则影响,也会完整保留其中的所有空白字符,而content元素仅含空白的内容会被正常裁剪。
注意事项
- 两个指令都支持使用通配符*指定所有元素,比如<xsl:strip-space elements="*"/>表示裁剪所有仅含空白的元素内容。
- 如果同一个元素同时被两个指令指定,preserve-space的规则会生效,strip-space的规则会被忽略。
- 指令的作用范围是整个XSLT样式表,不需要在每个模板中重复声明。
XSLTpreserve-spacestrip-spaceXML空格处理修改时间:2026-06-19 04:03:32