在.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
相关产品推荐
相关产品推荐

