在xsl变换之后,将<?xml version =“1.0”?>添加到xml文件的顶部
我已经成功地使用xsl模板将具有数据的简单xml文件转换为另一个xml文件(excel模板),这就是我的xsl文件的样子:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" standalone="yes"/> <xsl:template match="/"> <xsl:processing-instruction name="mso-application"> <xsl:text>progid="Excel.Sheet"</xsl:text> </xsl:processing-instruction> ...(stuff here)... </xsl:template> </xsl:stylesheet>
生成的xml文件写出正确,但包括除外
<?xml version="1.0"?>
在文件的顶部。 我怎样才能让它出现在顶部?
目前我的结果XML文件开始于:
<?mso-application progid="Excel.Sheet"?> ...(rest of file)...
但是我需要做的是:
<?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> .(rest of file)...
我正在做这个变换通过一个Windows窗体与下面的代码:
XPathDocument myXPathDoc = new XPathDocument(xmlfile); XslCompiledTransform myXslTrans = new XslCompiledTransform(); myXslTrans.Load(xslfile); XmlTextWriter myWriter = new XmlTextWriter(xmlexcelfile, null); myWriter.Formatting = Formatting.Indented; myWriter.Namespaces = true; myXslTrans.Transform(myXPathDoc, null, myWriter); myWriter.Close();
我尝试过使用xsl:output standalone="yes/no"
,以及omit-xml-declaration="no"
。 我也试过(在C#中)添加myWriter.WriteStartDocument();
在转换之前,但这是不允许的。 我也尝试在网上search这个以及继续回到standalone="yes"
但是这是行不通的。 有什么我在这里失踪? 哦,如果你想知道为什么我需要这个
<?xml version="1.0"?>
在生成的文件的顶部,这是因为当用excel打开xml文件时,excel不能正确识别它,但是如果它被包含然后excel打开它正确…
你可以这样做
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" />
或者类似于这个使用XmlWriterSettings
编辑 :添加更多的代码。 以前是缺less一些部分
XmlWriterSettings writerSettings = null; XsltArgumentList transformationArguments = null; XslCompiledTransform transformer = null; MemoryStream memoryStream = null; XPathDocument xPathDocument = null; StringBuilder sb = null; XmlWriter writer = null; XmlDocument resultXml = null; try { writerSettings = new XmlWriterSettings(); writerSettings.OmitXmlDeclaration = false; // This does it writerSettings.Indent = true; transformationArguments = new XsltArgumentList(); transformer = new XslCompiledTransform(); memoryStream = new MemoryStream(System.Text.Encoding.Default.GetBytes(xml.OuterXml)); xPathDocument = new XPathDocument(new StreamReader(memoryStream)); sb = new StringBuilder(); // give the settings to the writer here writer = XmlWriter.Create(sb, writerSettings); // this is not mandatory, obviously, just passing parameters to my xslt file foreach (KeyValuePair<string, object> parameter in parameters) { transformationArguments.AddParam(parameter.Key, string.Empty, parameter.Value); } using (Stream strm = Assembly.GetExecutingAssembly().GetManifestResourceStream("Lib.XSLTFile1.xslt")) using (XmlReader reader = XmlReader.Create(strm)) { transformer.Load(reader); transformer.Transform(xPathDocument, transformationArguments, writer); } resultXml = new XmlDocument(); resultXml.LoadXml(sb.ToString()); // for testing only File.AppendAllText(@"Your path goes here\result.xml", resultXml.OuterXml); } catch (Exception) { throw; }
这是我如何做的,但是这个代码是专门编写来创build一个XmlDocument
的实例。 我相信你可以适应你的需求。
- 如何确保我的Excel加载项不会加载.NET Framework 2.0的CLR?
- VSTO是否可以访问Excel Filter复选标记的内容?
- Microsoft Excel C API和Visual Studio
- 当数据库属性不匹配excel ASp.NET / core中的第一列时,将数据从Excel导入到现有数据表中
- 使用Windows窗体closures子线程更新excel文件; 返回受影响的行,但文件不更新
- Excel工作表重命名将无法工作
- 我们如何只提取具有第一列作为指定约束(string)使用OLEDB在ASP.NET中的特定行?
- 通过C#编写string,数字数据到Excel工作,但Excel不正确处理数字数据
- 由C到DLL的随机函数complie工作不正常