XSL/C#技术疑问:xsl:template输出为何自动添加换行?
XSLT文本输出自动添加换行和空格的问题及解决方法
问题背景
我使用XSLT的文本输出模式(xsl:output method="text")生成文件,通过C#代码执行转换,但输出总是带有多余的换行和缩进空格,希望解决这个问题。
我的XSLT代码
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:utils="urn:myExtension" exclude-result-prefixes="msxsl"> <!-- Déclaration du format de sortie (texte) --> <xsl:output method="text" indent="no" /> <!-- Modèle principal --> <xsl:template match="/"> test </xsl:template> </xsl:stylesheet>
输出问题
当前输出带有多余的换行和缩进空格:
test
我想知道为什么会自动添加这些换行?看起来XSLT模板里的缩进和换行被纳入了输出,能不能修改这个行为?我不希望标签的缩进被计入文本内容。
已尝试的有效写法
如果把模板写成以下两种形式,输出就正常(仅输出test):
- 把内容和标签写在同一行:
<xsl:template match="/">test</xsl:template>
- 使用
<xsl:text>包裹内容:
<xsl:template match="/"> <xsl:text>test</xsl:text> </xsl:template>
但我的模板里有大量<xsl:value-of select>语句,难道每次都必须用<xsl:text>吗?
我的C#执行代码
var xsltSettings = new XsltSettings(false, true); var transform = new XslCompiledTransform(); transform.Load(xsltFile, xsltSettings, new XmlUrlResolver()); transform.Transform(xmlFile, outputFile);
我也尝试过用XmlWriter,结果一样:
using (var writer = XmlWriter.Create(outputFile, transform.OutputSettings)) { transform.Transform(xmlFile, writer); }
解答
原因分析
在XSLT 1.0的文本输出模式下,模板中的空白节点(换行、空格、制表符)默认会被保留并输出——这些空白是你编写XSLT代码时为了格式化缩进留下的,XSLT解析器会把它们当作普通文本节点处理,最终输出到结果里。
解决方法
不需要给每个<xsl:value-of>都套<xsl:text>,可以通过以下几种高效方式处理:
- 用
<xsl:strip-space>批量去除多余空白
在<xsl:stylesheet>标签下添加这条指令:
<xsl:strip-space elements="*"/>
它会自动去除所有元素节点内的空白文本节点(也就是你写代码时加的缩进、换行),但不会影响你明确要保留的内容——比如<xsl:text>里的固定文本、<xsl:value-of>返回值里的空白。
- 仅对固定文本使用
<xsl:text><xsl:value-of>本身输出的是选中节点的内容,不会携带模板里的缩进空白,只有当你在模板里直接写固定文本(比如示例里的test)时,才需要用<xsl:text>包裹,避免缩进空白被输出。
比如混合使用的模板示例:
<xsl:stylesheet version="1.0" ...> <xsl:strip-space elements="*"/> <xsl:output method="text" indent="no" /> <xsl:template match="/"> <xsl:text>test: </xsl:text> <xsl:value-of select="someNode"/> <xsl:text> - </xsl:text> <xsl:value-of select="anotherNode"/> </xsl:template> </xsl:stylesheet>
此时输出只会是test: [someNode的值] - [anotherNode的值],没有多余的缩进和换行。
- 紧凑书写模板(不推荐)
如果不想用<xsl:strip-space>,可以把XSLT元素和文本内容紧凑写在同一行,但这种方式会严重降低代码可读性,只适合极简单的模板。
验证效果
给你原来的XSLT加上<xsl:strip-space>后,输出就会只保留你需要的test,不会带多余的空白。
内容的提问来源于stack exchange,提问作者BahaBulle
相关产品推荐
相关产品推荐

