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

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):

  1. 把内容和标签写在同一行:
<xsl:template match="/">test</xsl:template>
  1. 使用<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>,可以通过以下几种高效方式处理:

  1. 用<xsl:strip-space>批量去除多余空白
    在<xsl:stylesheet>标签下添加这条指令:
<xsl:strip-space elements="*"/>

它会自动去除所有元素节点内的空白文本节点(也就是你写代码时加的缩进、换行),但不会影响你明确要保留的内容——比如<xsl:text>里的固定文本、<xsl:value-of>返回值里的空白。

  1. 仅对固定文本使用<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的值],没有多余的缩进和换行。

  1. 紧凑书写模板(不推荐)
    如果不想用<xsl:strip-space>,可以把XSLT元素和文本内容紧凑写在同一行,但这种方式会严重降低代码可读性,只适合极简单的模板。

验证效果

给你原来的XSLT加上<xsl:strip-space>后,输出就会只保留你需要的test,不会带多余的空白。


内容的提问来源于stack exchange,提问作者BahaBulle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:09:53