XSLT使用SaxonHE 9.8进行.Net非转义输出

时间:2018-03-27 20:17:48

标签: .net xml xslt escaping saxon

我正在使用Saxon在.Net应用程序中执行XSLT转换。这是我的.net代码

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

        var destination = new DomDestination();
        var xsltTransformer = xsltExecutable.Load();

        xsltTransformer.InitialTemplate = new QName("startTemplate");
        xsltTransformer.Run(destination);

        destination.XmlDocument.Save(outputFile);
    }

这是我的示例test.xsl

<xsl:stylesheet version ="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xhtml" encoding="UTF-8"/>

<xsl:template name="startTemplate" > 
<a>
    <xsl:text disable-output-escaping="no">Test1 &lt; &gt; Test1</xsl:text>
    <br/>
    <xsl:text disable-output-escaping="yes">Test2 &lt; &gt; Test2</xsl:text>
</a>
</xsl:template> 

</xsl:stylesheet>

我需要让输出在转义和非转义表单中显示特殊字符(&lt;&gt;)。但是从上面的xsl示例中,我在test.html中得到的结果总是被转义。我认为问题是将Destination输出为XmlDocument,但我不知道如何解决它。有人可以给我一些建议吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

disable-output-escaping会影响XSLT序列化程序的操作。如果XSLT处理器没有执行序列化,则它不起作用。在你的情况下,序列化是使用XmlDocument.Save完成的,它不知道XSLT样式表中的任何内容。

如果要使用disable-output-escaping或其他XSLT序列化选项,则需要将转换输出发送到(Saxon)序列化程序。

话虽如此,当人们使用disable-output-escaping时,10次中有9次会有更好的方法来解决问题。