XslCompiledTransform 结果无法在浏览器中正确显示

时间:2021-01-02 23:42:05

标签: html xml xslt

我试图通过 XslCompiledTransform 将 XML 文件转换为 HTML 文件(然后最终转换为 pdf),但是最终结果不会显示在浏览器中,似乎是因为它正在添加一个文件开头的额外

private void GenerateHtmlBtn_Click(object sender, EventArgs e)
        {

            // Getting file path    
            string strXSLTFile = "Z:\\Database\\Report.xslt";
            string strXMLFile = "Z:\\Database\\Export.xml";

            // Creating XSLCompiled object    
            XslCompiledTransform objXSLTransform = new XslCompiledTransform();
            objXSLTransform.Load(strXSLTFile);

            // Creating StringBuilder object to hold html data and creates TextWriter object to hold data from XslCompiled.Transform method    
            StringBuilder htmlOutput = new StringBuilder();
            TextWriter htmlWriter = new StringWriter(htmlOutput);

            // Creating XmlReader object to read XML content    
            XmlReader reader = XmlReader.Create(strXMLFile);

            // Call Transform() method to create html string and write in TextWriter object.    
            objXSLTransform.Transform(reader, null, htmlWriter);
            textBox2.Text = htmlWriter.ToString();

            using (FileStream fs = new FileStream("Z:\\Database\\Export.html", FileMode.Create))
            {

                XmlSerializer ser = new XmlSerializer(typeof(string));

                ser.Serialize(fs, htmlOutput.ToString());
            }

            // Closing xmlreader object    
            reader.Close();
            
        }

这是 XSLT 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>    
  <html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
  <body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
    <xsl:for-each select="ArrayOfPerson">
      <xsl:for-each select="Person">
        <div style="background-color:gray;color:white;padding:4px">
          <span style="font-weight:bold">
            Name: <xsl:value-of select="Name"/>
          </span>
          - Id: <xsl:value-of select="id"/>
        </div>
        <div style="margin-left:20px;margin-bottom:1em;font-size:10pt">
          <span style="font-style:italic">
            Current Value: <xsl:value-of select="CurrentValue"/>
          </span>
          <span style="font-style:italic">
             Simulated Value: <xsl:value-of select="SimulatedValue"/>
          </span>
        </div>
      </xsl:for-each>
    </xsl:for-each>
  </body>
</html>

最后是最终结果:

<?xml version="1.0"?>
<string><?xml version="1.0" encoding="utf-16"?><html xmlns="http://www.w3.org/1999/xhtml"><body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE"><div style="background-color:gray;color:white;padding:4px"><span style="font-weight:bold">
            Name: Full Test3</span>
          - Id: 3344558</div><div style="margin-left:20px;margin-bottom:1em;font-size:10pt"><span style="font-style:italic">
            Current EFC: 1500</span><span style="font-style:italic">
             Simulated EFC: 7</span></div></body></html></string>

非常感谢任何帮助!!

2 个答案:

答案 0 :(得分:0)

正如评论之一提到的,不要使用 XmlSerializer 输出文件。我删除了那部分并尝试指定一个输出文件,但输出(在解决额外的标签症状时)其中没有任何 HTML 或 XML 输出(只有从 XML 输入的值)。最终我使用了以下答案:White space cannot be stripped from input documents that have already been loaded. Provide the input document as an XmlReader instead

感谢大家的帮助!

答案 1 :(得分:-1)

XSLT 文件完全倾斜。

为了从输出中消除 XML prolog 声明,以下子句应在 XSLT 中:

omit-xml-declaration="yes"

附加说明:

  • 不清楚想要的输出是什么:完整的 HTML 或 它的片段。如果需要,可以指定 method="html"
  • 用于 XSLT 转换的 c# 可以改进。

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/>
   <xsl:strip-space elements="*"/>
   ...
</xsl:stylesheet>