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

在.Net应用中使用SaxonHE 9.8实现XSLT非转义输出的技术咨询

在.NET中用SaxonHE 9.8实现XSLT非转义输出

我来帮你搞定这个非转义输出的问题!看你的代码片段里用了DomDestination,这大概率是导致内容被自动转义的核心原因——因为DomDestination会把输出转换成DOM节点树,而DOM规范要求<、>、&这类特殊字符必须转义,所以要实现非转义输出,我们可以从这几个方向调整:

方案1:替换输出目标为Stream/TextWriterDestination

直接绕过DOM的转义逻辑,改用直接输出文本的目标类型,比如StreamDestination(直接写入文件)或者TextWriterDestination(先暂存为字符串)。修改后的完整代码如下:

private void xsltTransform() 
{ 
    string xsltFile = Path.Combine(TEirPath, "test.xsl"); 
    string outputFile = Path.Combine(TEirPath, "test.html"); 

    var xslt = new FileInfo(xsltFile); 
    var processor = new Processor(); 
    var xsltCompiler = processor.NewXsltCompiler(); 
    var xsltExecutable = xsltCompiler.Compile(new Uri(xslt.FullName)); 

    // 替换DomDestination为StreamDestination,直接输出到文件
    var destination = new StreamDestination(outputFile); 
    var xsltTransformer = xsltExecutable.Load(); 

    // 这里可以设置你的XML输入源(如果需要的话)
    // var inputSource = new StreamSource("你的输入XML文件路径");
    // xsltTransformer.SetInput(inputSource);

    xsltTransformer.Run(destination); 
}

如果需要先拿到非转义的字符串再做后续处理,可以用TextWriterDestination:

private void xsltTransform() 
{ 
    string xsltFile = Path.Combine(TEirPath, "test.xsl"); 

    var xslt = new FileInfo(xsltFile); 
    var processor = new Processor(); 
    var xsltCompiler = processor.NewXsltCompiler(); 
    var xsltExecutable = xsltCompiler.Compile(new Uri(xslt.FullName)); 

    var xsltTransformer = xsltExecutable.Load(); 
    // 设置输入源...

    using (var stringWriter = new StringWriter())
    {
        var destination = new TextWriterDestination(stringWriter);
        xsltTransformer.Run(destination);
        string unescapedOutput = stringWriter.ToString();
        // 这里可以把unescapedOutput写入文件或者做其他处理
        File.WriteAllText(Path.Combine(TEirPath, "test.html"), unescapedOutput);
    }
}

方案2:在XSLT中配置输出属性

配合输出目标的调整,在你的test.xsl里添加<xsl:output>元素,明确输出格式并禁用不必要的转义:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 针对HTML输出的配置,禁用URI属性转义,输出UTF-8编码 -->
    <xsl:output method="html" encoding="UTF-8" escape-uri-attributes="no" />

    <!-- 你的XSLT模板逻辑... -->
</xsl:stylesheet>

如果是要输出纯文本,直接把method设为text,这样Saxon会完全按照模板里的内容输出,不会转义任何字符。

方案3:在XSLT中使用disable-output-escaping(谨慎使用)

如果某些特定内容需要强制非转义,可以在XSLT模板里用<xsl:text disable-output-escaping="yes">包裹内容:

<xsl:text disable-output-escaping="yes">
    <p>这里的&符号和<标签>都会直接输出,不会被转义</p>
</xsl:text>

⚠️ 注意:这个属性不是所有输出目标都支持,比如DomDestination依然会转义,所以还是优先用方案1+方案2的组合更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:35:39